Gis ST_GeomFromText有多贵

Gis ST_GeomFromText有多贵,gis,postgis,Gis,Postgis,在postgis中,ST_GeomFromText调用是否非常昂贵?我问这个问题主要是因为我有一个经常调用的查询,它试图找到与某个条件匹配的另一个点最近的点,该点与另一个点也在一定距离内,按照我目前编写的方式,它两次执行相同的ST_GeomFromText: 有没有更好的方法来重写这个 略为OT:在预览屏幕中,我的所有下划线都呈现为&9 5;-我希望这不会以这种方式出现在帖子中。我不认为ST_GeomFromText特别昂贵,尽管在过去,我通过创建函数、声明变量,然后将ST_GeomFromTe

在postgis中,ST_GeomFromText调用是否非常昂贵?我问这个问题主要是因为我有一个经常调用的查询,它试图找到与某个条件匹配的另一个点最近的点,该点与另一个点也在一定距离内,按照我目前编写的方式,它两次执行相同的ST_GeomFromText:

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

略为OT:在预览屏幕中,我的所有下划线都呈现为&9 5;-我希望这不会以这种方式出现在帖子中。

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

您是否尝试过使用各种不同的参数检查查询的执行计划,因为这会让您明确知道查询的哪些部分需要时间

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

@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 by和限制,一个典型的查询看起来最多只返回5-10个航路点。因此,我可能不应该担心应用于返回的点的过滤器的额外成本。

+1显示了如何使用explain获得数字而不是信念。在过早的优化开始之前,Q&A可能值得探索。
 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)