sql join语句中表的顺序有啥意义吗

Posted

技术标签:

【中文标题】sql join语句中表的顺序有啥意义吗【英文标题】:Is there any significance in the order of table in sql join statementsql join语句中表的顺序有什么意义吗 【发布时间】:2012-06-14 18:32:05 【问题描述】:

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

表格的顺序有什么性能优势吗?

【问题讨论】:

【参考方案1】:

不,没有。

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

Oracle SQL cost based optimization

Oracle 的基于成本的 SQL 优化器 (CBO) 是一个极其复杂的 Oracle 的组件,它控制每个 Oracle 查询的执行。 CBO 已发展成为世界上最先进的机构之一 软件组件,并且它具有评估任何 SQL 语句并生成“最佳”执行计划 声明。

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

【讨论】:

+1。我要补充(只是为了挑剔)这两个语句应该生成相同的执行计划,其他一切都相等(即大约在同一时间解析,具有相同的表统计信息等)。在某些情况下(超出此问题的范围)这两个查询可能会给出不同的计划。【参考方案2】:

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

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

【讨论】:

+1 我曾想过在我的回答中提及这一点,但我无法像您那样简单地把它拼出来,而且出于大多数意图和目的,被它咬住的机会很小. 我刚刚遇到了这样一种情况,我有一个 150 万行的表与 4 个其他表,每个表有大约 50k 行。连接顺序有明显的影响,在某些顺序中查询需要超过 30 秒,在其他顺序中约为 0.01 秒。【参考方案3】:

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

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

【讨论】:

【参考方案4】:

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

【讨论】:

【参考方案5】:

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

【讨论】:

实际上,你倒过来了。内连接通常比外连接执行得更好。

以上是关于sql join语句中表的顺序有啥意义吗的主要内容,如果未能解决你的问题,请参考以下文章

SQL语句的执行顺序

SQL语句的执行顺序的理解

SQL语句的执行顺序的理解

sql语句执行顺序

SQL语句的执行顺序怎么理解,特别是ORDER BY子句怎么理解?

SQL语句中SELECT语句的执行顺序