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

时间:2012-06-14 18:32:06

标签: sql database oracle

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

SELECT dept_name, emp_name 
FROM   Employee 
INNER JOIN Department ON Employee.dept_id = Department.dept_id

SELECT dept_name, emp_name 
FROM Department 
INNER JOIN Employee  ON Employee.dept_id = Department.dept_id

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

5 个答案:

答案 0 :(得分:14)

不,没有。

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

Oracle SQL cost based optimization

  

Oracle基于成本的SQL优化器(CBO)非常复杂   Oracle的组件,用于管理每个Oracle查询的执行。   CBO已经发展成为世界上最复杂的一个   软件组件,它具有评估任何功能的挑战性工作   SQL语句并为其生成“最佳”执行计划   言。

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

答案 1 :(得分:6)

总的来说,没关系也没关系。优化器应该能够找出加入表的最有效顺序,无论它们出现在查询中的顺序如何。

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

答案 2 :(得分:1)

优化程序将检查所有可能的连接顺序排列,并采用成本最低的排列。这意味着优化自身 - 准备语句 - 成为复杂语句的瓶颈。要加入的表越多,检查的执行计划变量就越多 - 数学上说:n! (阶乘)。

来源:http://use-the-index-luke.com/sql/join

答案 3 :(得分:0)

没有。优化器计算出最佳连接路径,或者至少它认为是最佳连接路径。在不寻常的情况下,有时它没有所需的所有信息,但99%的时间它会使它正确。它还将以其他方式在内部重写SQL语句。

答案 4 :(得分:-1)

正如其他的避孕者所说,不 但想想你是否可以用左连接替换一些内部连接。在大多数查询中,这是性能的好处