Postgres ST_Distance最佳性能查询谁找到最近的点



目前,我有这个查询

SELECT "Id" 
FROM "Point" 
WHERE ST_Distance(ST_SetSRID(ST_Point("Longitude", "Latitude"), 4326)::geography, 
ST_SetSRID(ST_Point(@longitudeOfA, @latitudeOfA), 4326)::geography) <= @MaxDistance 
LIMIT 1

如您所见,我不会将空间数据保留在我的点表中,而是在具有纬度和经度列的查询选择语句 (ST_Point( 上创建空间数据。

此查询的目的是检查半径@MaxDistance是否至少有一个点。

恐怕在执行此选择查询时,我在每条记录上都创建了ST_Point。

至少知道记录不多,所以性能就足够了,但是由于每条记录上的ST_Pin创建,恐怕在点记录很多的时候会变得非常昂贵。

由于某些限制,我无法在点表上创建空间数据。

对于大量点,此查询无法有效。不是因为它必须创建地理,而是因为它不使用空间索引st_distance

我会亲自创建一个几何或地理,因为它可以很容易地使用它们(PostGIS 函数(。

重要的是空间索引。在本例中,如果没有几何/地理列,您将创建一个函数索引

create index spatialIDX on mytable using gist(ST_SetSRID(ST_Point("Longitude", "Latitude"), 4326)::geography);

然后将查询更改为使用ST_DWithin,这会使用索引。
不要忘记按距离排序,否则您会在所需距离内获得一个随机点。(请注意,<>运算符使用索引,但它必须在几何字段而不是地理字段上创建。您不妨依赖排序子句中的st_distance。如果你有小点要订购,任何一个都可以。否则,在几何上创建一个索引(

SELECT "Id" 
FROM "Point" 
WHERE ST_DWithin(ST_SetSRID(ST_Point("Longitude", "Latitude"), 4326)::geography, 
ST_SetSRID(ST_Point(@longitudeOfA, @latitudeOfA), 4326)::geography,
@MaxDistance) 
ORDER BY  ST_SetSRID(ST_Point("Longitude", "Latitude"), 4326) <-> ST_SetSRID(ST_Point(@longitudeOfA, @latitudeOfA), 4326)
LIMIT 1;

相关内容

  • 没有找到相关文章

最新更新