postgres查询的奇怪表现

时间:2016-07-29 14:08:58

标签: sql performance postgresql

我非常奇怪的问题,当我执行如下查询时:

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百万行。

有没有人有想法,我可以尝试提高性能。我把问题简化为这个非常简单的问题,但实际上结构要复杂得多,这就是为什么我没有为你提供表格创建和查询计划......

1 个答案:

答案 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