[英]strange performance of postgres query
我非常奇怪的问题,当我执行如下查询:
with ap as (
SELECT id from adress limit 1000)
)
SELECT distinct house.id, house.date
FROM house
WHERE house.adressid in (select id from ap)
LIMIT 9999
我在100毫秒内完成了结果
但是当我将限制改为10时,我会在20秒后得到一个结果
with ap as (
SELECT id from adress limit 1000)
)
SELECT distinct house.id, house.date
FROM house
WHERE house.adressid in (select id from ap)
LIMIT 10
当然adressid上有索引
CREATE INDEX house_idx
ON house
USING btree
(adressid COLLATE pg_catalog."default");
在内部有9百万行。
有没有人有想法,我可以尝试提高性能。 我把问题简化为这个非常简单的问题,但实际上结构要复杂得多,这就是为什么我没有为你提供表格创建和查询计划......
这实际上并不奇怪:
在第一种情况下, ap
最多有1000行,结果集应该最多为9999,因此优化器首先放置adress
。 随着house
查询性能指数相对较高。
在第二种情况下, ap
仍然有多达1000行,但结果集应该只有10,所以优化器首先放置house
......最后在每个最多1000行的adress
上进行10次表扫描。 它可能无法使用索引,因为任何地方都没有Order By子句。
地址上的这个limit 1000
看起来非常可疑并且可能导致不一致的结果:没有Order By
无法保证在每次运行期间会考虑来自adress
哪些记录。
我会使用INNER JOIN
解决问题:
SELECT DISTINCT house.id, house.date
FROM house
INNER JOIN adress ON adress.id = house.adressid
ORDER BY house.date --< To add some consistency
LIMIT 10
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.