UPDATE tbl
SET city=s.city_name
FROM shp AS s
WHERE
ST_CONTAINS(s.city_geom,geom);
使用上面的代码,我可以将精确的城市添加到GPS点。 它在5000万行上运行大约45-50分钟。 “城市”表中大约有4000个城市需要检查。
我有另一个形状文件,在给定的国家/地区只有19个县(只有1个国家/地区)。 将县添加到点数大约需要1.5小时。
我有52个欧盟国家的第三个形状文件。 它使用相同的SQL查询运行将近25个小时。
每个表都有geom索引,如:
CREATE INDEX idx_txt_geom ON txt USING GIST(geom);
问:为什么只检查几个多边形时这么慢?
解释分析:
Update (cost=0.00..324.85 rows=1 width=286) (actual time=353.932..353.932 rows=0 loops=1)
Buffers: shared hit=73090 read=1
-> Nested Loop (cost=0.00..324.85 rows=1 width=286) (actual time=0.544..341.936 rows=471 loops=1)
Join Filter: _st_contains(s.geom, prob.geom)
Buffers: shared hit=69985
-> Seq Scan on world s (cost=0.00..83.44 rows=244 width=48) (actual time=0.009..0.319 rows=244 loops=1)
Buffers: shared hit=81
-> Index Scan using idx_prob_geom on prob (cost=0.00..0.73 rows=1 width=270) (actual time=0.003..0.024 rows=9 loops=244)
Index Cond: (s.geom && prob.geom)
Buffers: shared hit=533
Total runtime: 354.640 ms
答案 0 :(得分:1)
ST_CONTAINS无法使用索引。试试这个:
UPDATE tbl
SET city=s.city_name
FROM shp AS s
WHERE
(geom && s.city_geom) and ST_CONTAINS(s.city_geom,geom);
&&
检查边界框并使用索引。