我非常奇怪的问题,当我执行如下查询时:
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百万行。
有没有人有想法,我可以尝试提高性能。我把问题简化为这个非常简单的问题,但实际上结构要复杂得多,这就是为什么我没有为你提供表格创建和查询计划......
答案 0 :(得分:0)
这实际上并不令人惊讶:
在第一种情况下,ap
最多有1000行,结果集应该最多为9999,因此优化器首先放置adress
。索引house
的查询性能相对较高。
在第二种情况下,ap
仍然有最多1000行,但结果集最多只有10行,因此优化器首先放置house
...最后进行10次表扫描在adress
上,每行最多1000行。它可能无法使用索引,因为任何地方都没有Order By子句。
此limit 1000
地址看起来非常可疑,可能会导致结果不一致:如果没有Order By
,则无法保证每次运行时会考虑adress
中的哪些记录。< / p>
我会使用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