繁体   English   中英

postgres查询的奇怪表现

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM