0

也许我的问题看起来很愚蠢,但我想问一下是否有人可以告诉我如何改进这个查询:

UPDATE twitter
   SET poi=poi.type_name FROM poi
 WHERE ST_Within (ST_SetSRID(ST_MakePoint(x_coords,y_coords),4326),
 ST_SetSRID(ST_Buffer(poi.wkb_geometry, 0.0005),4326));

我有 2 个带有点的表:“ twitter”和“ poi”,我需要在“ 周围创建一个 50m 的缓冲区,poi并找到twitter该缓冲区内的所有“”点,然后将“ type_name”的“”属性复制poi到“ twitter”点。问题是查询持续时间太长,似乎永远不会完成,有时我会尝试检查是否复制了某些属性,但“ twitter.poi”列始终为空。

我试图通过添加WHERE " username"来限制查询,以检查查询是否正确并且有效。

UPDATE twitter
       SET poi=poi.type_name FROM poi
     WHERE uname='some_username' AND ST_Within (ST_SetSRID(ST_MakePoint(x_coords,y_coords),4326),
     ST_SetSRID(ST_Buffer(poi.wkb_geometry, 0.0005),4326));

我唯一不明白的一件事是如何改进对整个“ twitter”表的查询。

4

1 回答 1

2

您没有提供表格定义,但您似乎在 table twitter:x_coords和中有两列坐标y_coords。要么用geometry列替换那些并创建一个简单的 GiST 索引,要么创建一个功能性 GiST 索引,如:

CREATE INDEX idx_twitter_point_4326
ON twitter  USING gist (ST_SetSRID(ST_MakePoint(x_coords,y_coords), 4326));

还有一个在poi

CREATE INDEX idx_poi_wkb_geometry_4326
ON poi USING gist (ST_SetSRID(p.wkb_geometry, 4326));

这应该用于加速ST_Within()

此函数调用将自动包含一个边界框比较,该比较将利用几何上可用的任何索引。

函数ST_distance()可能会更好地为您服务:

UPDATE twitter t
SET    poi = p.type_name
FROM   poi p
WHERE  ST_Distance(ST_SetSRID(ST_MakePoint(t.x_coords, t.y_coords), 4326)
                  ,ST_SetSRID(p.wkb_geometry, 4326)) < 0.0005
AND    t.poi IS DISTINCT FROM p.type_name;

这是假设在入口附近最多可以有一个。 否则,您应该使用一个子查询来每个.poitwitter poitwitter

附加WHERE条款t.poi IS DISTINCT FROM p.type_name避免空更新。

我自己没有使用 PostGis,所以未经测试。

于 2013-06-13T16:06:15.430 回答