使用in子句缓慢Postgres性能

时间:2015-02-19 00:02:29

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

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

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

此查询需要800毫秒。

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

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

此查询仅需16 ms。

单独执行内部选择需要4 ms。

Chnagelog.entid有一个索引。 Contract.ctris是主键。合同表只有2行,更改日志表有大约4万行。

我仍然无法理解这一点。内部人选择的问题是什么?

1 个答案:

答案 0 :(得分:0)

很抱歉没有提供足够的详细信息,我会更精确,并且下次会按照标记说明进行操作。

更改日志和合同的加入对性能没有太大影响。

这里的问题是changelog是一个VIEW。它是changelogActive和changelogPendig表的联合。 Postgres需要在每个选择中加入视图中的两个表。

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