14

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

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

4

5 回答 5

14

不,没有。

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

Oracle SQL 基于成本的优化

Oracle 的基于成本的 SQL 优化器 (CBO) 是 Oracle 的一个极其复杂的组件,它控制着每个 Oracle 查询的执行。CBO 已经发展成为世界上最复杂的软件组件之一,它具有评估任何 SQL 语句并为该语句生成“最佳”执行计划的挑战性工作。

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

于 2012-06-14T18:36:03.037 回答
6

一般来说,不,这无关紧要。优化器应该能够找出连接表的最有效顺序,而不管它们在查询中出现的顺序如何。

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

于 2012-06-14T21:33:09.693 回答
1

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

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

于 2012-06-14T18:37:29.037 回答
0

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

于 2012-06-14T18:37:08.030 回答
-1

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

于 2012-06-14T18:48:39.567 回答