【发布时间】: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