【问题标题】:Slow Postgres performance with in clausein 子句的 Postgres 性能缓慢
【发布时间】:2015-04-20 04:55:47
【问题描述】:

我有一个安静的简单查询:

SELECT
  contract.ctrId,
  contract.ctrNr
FROM
  changeLog,
  contract
where
  changelog.entid in (select contract.ctrid from contract where contract.ctrnr LIKE '1000002%');

此查询需要 800 毫秒。

如果我将带有内部选择子句的查询更改为选择的结果(这是单个数字)

SELECT
  contract.ctrId,
  contract.ctrNr
FROM
  changeLog,
  contract
where
  changelog.entid in (100000001611624);

这个查询只需要 16 毫秒。

单独执行的内部选择需要 4 毫秒。

Chnagelog.entid 有一个索引。 Contract.ctris id 一个主键。 contract 表只有 2 行,changelog 表大约有 4 万行。

我仍然无法理解这一点。内部选择可能有什么问题?

【问题讨论】:

  • 您查看/比较过查询计划吗?
  • 关于性能的问题需要正确的信息。请考虑 [postgresql-performance] 的标签信息中的说明。
  • 在担心性能之前,我认为您应该修复您的查询。您尚未指定连接条件,因此您将获得笛卡尔连接......合同中的每条记录都被连接到 changeLog 中的每条记录。在这种特殊情况下,这可能不是什么大问题,因为合同只有 2 条记录,但总的来说这是不好的做法(除非是故意的)。
  • 您能否将 EXPLAIN ANALYZE 的两个结果发布到 explain.depesz.com

标签: performance postgresql select postgresql-performance sql-execution-plan


【解决方案1】:

抱歉没有提供足够的细节,下次我会更精确地按照标签描述进行操作。

changelog和contract的join对性能影响不大。

这里的问题是变更日志是一个视图。它是 changelogActive 和 changelogPendig 表的联合。 Postgres 需要在每次选择时加入视图中的两个表。

谢谢大家的提示,你们帮了很多忙!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 2021-11-03
    • 1970-01-01
    • 2019-06-07
    • 1970-01-01
    • 1970-01-01
    • 2010-12-01
    相关资源
    最近更新 更多