【发布时间】:2017-09-07 09:16:17
【问题描述】:
我有这个问题:
SELECT *
FROM placex AS place
WHERE ST_DWithin(geometry, (SELECT geometry FROM placex WHERE place_id = 412369), 300)
AND name->'name' = (SELECT name->'name' FROM placex WHERE place_id = 412369)
前置时间:530-650ms
这个查询使用两个 SELECT,它很丑,我想用连接重写。但是这个查询:
SELECT same.*
FROM placex AS same
JOIN placex AS place ON place.place_id = 412369
WHERE ST_DWithin(same.geometry, place.geometry, 300)
AND same.name->'name' = place.name->'name';
在 2.8 秒内完成。所有索引都默认保留(由 Nominatim 提供)。如何优化第二个查询?还是先用再不用担心?
PostgreSQL 9.6.4,POSTGIS 2.3.3 r15473
【问题讨论】:
-
添加指向 EXPLAIN(分析,缓冲区)的链接
-
如果您查看
EXPLAIN ANALYZE的输出,您会发现它们不是等效查询; JOIN 版本产生 25 行,而子选择版本产生 1。
标签: postgresql postgis nominatim