【问题标题】:How expensive is ST_GeomFromTextST_GeomFromText 有多贵
【发布时间】:2008-08-30 17:25:40
【问题描述】:

在 postgis 中,ST_GeomFromText 调用非常昂贵吗?我问主要是因为我有一个经常调用的查询,它试图找到最接近另一个符合某些条件的点的点,并且该点也在该另一个点的一定距离内,而我目前编写它的方式,它正在做相同ST_GeomFromText 两次:

 $findNearIDMatchStmt = $postconn->prepare(
    "SELECT     internalid " .
    "FROM       waypoint " .
    "WHERE      id = ? AND " .
    "           category = ? AND ".
    "           (b.category in (1, 3) OR type like ?) AND ".
    "           ST_DWithin(point, ST_GeomFromText(?," . SRID .
    "           ),".  SMALL_EPSILON . ") " .
    "           ORDER BY ST_Distance(point, ST_GeomFromText(?,", SRID .
    "           )) " .
    "           LIMIT 1");

有没有更好的方法来重写这个?

有点 OT:在预览屏幕中,我所有的下划线都呈现为 & # 9 5 ; - 我希望在帖子中不会这样显示。

【问题讨论】:

    标签: gis postgis


    【解决方案1】:

    我不认为ST_GeomFromText() 的成本特别高,尽管过去我通过创建函数、声明变量然后将ST_GeomFromText 的结果分配给变量来优化PostGIS 查询。

    您是否尝试过使用各种不同的参数检查查询的执行计划,因为这可以让您明确了解查询的哪些位占用了时间?

    我猜大部分执行时间将在对ST_DWithin()ST_Distance() 的调用中,尽管如果 id 和 category 列没有被索引,那么它可能会进行一些有趣的表扫描。

    【讨论】:

      【解决方案2】:

      @Ubiguch ST_DWithin 似乎使用了空间索引,因此似乎很快就减少了要查询的点数。

       navaid=> explain select internalid from waypoint where id != 'KROC' AND ST_DWithin(point,                                                                  ST_GeomFromText('POINT(-77.6723888888889 43.1188611111111)',4326), 0.05) order by st_distance(point, st_geomfromtext('POINT(-77.6723888888889 43.1188611111111)',4326)) limit 1;
                                                                                                                                                                                                                                                            QUERY PLAN                                                                                                                                                                                                                                                       
      -----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
       Limit  (cost=8.37..8.38 rows=1 width=104)
         ->  Sort  (cost=8.37..8.38 rows=1 width=104)
               Sort Key: (st_distance(point, '0101000020E61000002FFE676B086B53C0847E44D7368F4540'::geometry))
               ->  Index Scan using waypoint_point_idx on waypoint  (cost=0.00..8.36 rows=1 width=104)
                     Index Cond: (point && '0103000020E61000000100000005000000000000C03B6E53C000000060D0884540000000C03B6E53C0000000409D95454000000020D56753C0000000409D95454000000020D56753C000000060D0884540000000C03B6E53C000000060D0884540'::geometry)
                     Filter: (((id)::text <> 'KROC'::text) AND (point && '0103000020E61000000100000005000000000000C03B6E53C000000060D0884540000000C03B6E53C0000000409D95454000000020D56753C0000000409D95454000000020D56753C000000060D0884540000000C03B6E53C000000060D0884540'::geometry) AND ('0101000020E61000002FFE676B086B53C0847E44D7368F4540'::geometry && st_expand(point, 0.05::double precision)) AND (st_distance(point, '0101000020E61000002FFE676B086B53C0847E44D7368F4540'::geometry) < 0.05::double precision))
      (6 rows)
      

      没有order bylimit,看起来典型的查询最多只返回5-10 个航点。所以我可能不应该担心应用于返回点的过滤器的额外成本。

      【讨论】:

      猜你喜欢
      • 2010-12-05
      • 1970-01-01
      • 2012-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-08
      • 2011-07-20
      • 1970-01-01
      相关资源
      最近更新 更多