我在PostGis中有一个表points
,其中包含id, city, the_geom
这样的列,其中the_geom
只是ST_GeomFromText('POINT(121.3937853 31.2086933144)')
创建的地理点。
我有大量的位置点,并且对于每个点,我需要选择距离该点不超过1000米的所有表行。
我是PostGis的新手,我有两种可行的方法: a)
SELECT p.id, p.city
FROM points p
WHERE ST_DWithin(p.the_geom, ST_GeomFromText('POINT(112.979921623 28.198844793)', 4326)::geography, 1000)";
b)中
我从现有表中创建了另一个表,the_geom
创建了ST_Buffer
作为
INSERT INTO buffered_points(id, city, the_geom)
SELECT p.id, p.city, ST_Buffer(p.the_geom, 1000) FROM points p;
然后查询它
SELECT bp.id, bp.city
FROM buffered_points bp where ST_Contains(bp.the_geom::geometry, ST_GeomFromText('POINT(112.979921623 28.198844793)', 4326)::geometry)");
当然,我将在the_geom
的所有这些表的USING GIST (the_geom)
列上创建索引。
由于我需要处理的位置数量巨大,因此查询性能对我来说至关重要
因此,我的问题是,方法b)在表现方面优于方法a),表格索引的加速
我想由ST_Buffer
创建的多边形可以从GIST索引中受益,但不确定a)的the_geom
方法是否可以。
答案 0 :(得分:0)
事实证明ST_Buffer
方法比ST_DWithin
方法慢得多。