【发布时间】:2017-01-26 15:04:32
【问题描述】:
我正在为大型交易金融系统调整查询。我注意到,在 where 子句 以及 from 子句中包含连接条件会使查询的运行速度明显快于两者中的任何一个。我注意到 from 子句中的 join 有多个条件;我提到这一点以防它很重要。这是一个简化的示例:
SELECT *
FROM employee e
INNER JOIN car c ON c.id = e.car_id AND -- some other join
-- Adding the join above again, in the where clause makes the query faster
WHERE c.id = e.car_id;
我认为 ANSI 与老式相比纯粹是句法。怎么回事?
更新
分析了这两个执行计划后,很明显在 where 子句中添加与 from 子句相同的连接会产生与在两者中的任何一个中添加连接的非常不同的执行计划。
比较计划,我可以看到带有附加 where 子句条件的计划做得更好,并想知道为什么没有的计划以它的方式加入。知道了最佳计划,对连接条件的快速调整就解决了问题,尽管我仍然对两个查询没有编译成同一件事感到惊讶。黑魔法。
【问题讨论】:
-
看看解释计划会很有趣;你能把它们贴出来吗?另外,哪个 Oracle 版本?
-
是的,这很有趣。对于 SQL Server,它是纯语义的。
-
@Aleksej 恐怕我不能,我会违反工作中的安全政策。不过感谢您的帮助!
-
解释计划的“注释”部分是否有任何配置文件、大纲或 SQL 计划基线?更改查询的文本可能会阻止这些操作。
标签: sql oracle sql-tuning