在sql join语句中的表顺序是否有任何意义

iam*_*esh 13 sql database oracle

在sql join语句中的表顺序是否有任何意义.例如

SELECT dept_name, emp_name 
FROM   Employee 
INNER JOIN Department ON Employee.dept_id = Department.dept_id
Run Code Online (Sandbox Code Playgroud)

SELECT dept_name, emp_name 
FROM Department 
INNER JOIN Employee  ON Employee.dept_id = Department.dept_id
Run Code Online (Sandbox Code Playgroud)

表的顺序是否有任何性能优势?

Lie*_*ers 14

不,没有.

大多数(如果不是全部)DBMS使用基于成本的优化器.指定语句的顺序不会影响执行速度.

Oracle SQL基于成本的优化

Oracle基于成本的SQL优化器(CBO)是Oracle中极其复杂的组件,用于管理每个Oracle查询的执行.CBO已经发展成为世界上最复杂的软件组件之一,它在评估任何SQL语句和为语句生成"最佳"执行计划方面具有挑战性的工作.

您的两个语句都将生成相同的执行计划,因此具有相同的性能特征.请注意,费用将基于可用的统计信息.更新的统计信息对于优化器能够生成最有效的执行计划非常重要.


Jus*_*ave 6

一般来说,没关系也没关系.优化器应该能够找出加入表的最有效顺序,而不管它们在查询中出现的顺序如何.

但是,表的顺序可能会影响查询计划.如果您有一个简单的两个表连接,但通常不会出现这种情况,但随着查询中表的数量的增加,可能的连接数会以O(n!)速率增长.很快,优化器就不可能考虑所有可能的连接顺序,因此它必须使用各种启发式来修剪树.反过来,这导致优化器选择不同的驱动表的情况,如果该表在SQL语句中首先列出,而不是该表是查询中的第10个表.Jonathan Lewis有一篇很好的博客文章,展示了订单表在查询中的显示方式如何影响查询计划.如果你想要格外小心,首先列出驾驶表是一件合理的事情 - 它不会经常发生,但它偶尔会有所帮助.