在from子句*和* where子句中添加连接条件可以加快查询速度。为什么呢?

时间:2017-01-26 15:04:33

标签: sql oracle sql-tuning

我正在调整大型交易金融系统的查询。我注意到在where子句中包含连接条件以及 from子句使得查询运行速度明显快于两者中的任何一个。我注意到from子句中的连接有多个条件;我提到这个是重要的。这是一个简化的例子:

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 vs old-school纯粹是语法。发生了什么事?

更新

分析了两个执行计划之后,很清楚在where子句中添加与from子句相同的连接会产生一个非常不同的执行计划,而不是在两个任何一个中都有连接。

比较计划,我可以看到附加where子句条件的计划做得更好,并想知道为什么没有的人加入的方式就是这样。知道了最佳计划,对连接条件的快速调整解决了问题,尽管我仍然对两个查询都没有编译成相同的东西感到惊讶。黑魔法。

1 个答案:

答案 0 :(得分:1)

可能是WHERE c.id = e.car_id添加是一种控制表用于执行正确搜索的顺序的方法。 这可能是一种强制查询优化器用作主表的方法,其中条件和表相关的表因为表连接的顺序不能对搜索有效,因为它对于理解查询逻辑很有用