“加入”顺序是否会导致不同的查询性能

时间:2016-03-17 08:21:13

标签: sql sql-server tsql

我有2个表(table1 table2),table2大于table1。

脚本1:

SELECT t1.A, t2.B
FROM table1 AS t1
JOIN table2 AS t2 ON t1.PK = t2.FK

脚本2:

SELECT t1.A, t2.B
FROM table2 AS t2
JOIN table1 AS t1 ON t1.PK = t2.FK

性能脚本#1是否优于脚本#2?

3 个答案:

答案 0 :(得分:2)

您使用的是 INNER JOIN ,所以答案是

由于连接类型,这将产生完全相同数量的数据,并且您在两个查询中加入相同的关系,因此它们基本相同。

如果您使用 LEFT JOIN 会有所不同,因为在左连接中,保留了主(左)表中的所有数据,以及来自详细信息的所有匹配数据表(右)。

因此,如果您使用了左连接,并将较大的表放在左侧,那么查询将生成更多数据,并且可能会比较大的表放在右侧更慢。

答案 1 :(得分:2)

应该创建相同的计划。但是如果你有很多连接改组,那么由于处理这些连接的大量可能方法,连接顺序可能会改变计划。

请参阅Optimizing Join Orders

当然这仅适用于内连接,外连接可能会返回不同的结果。顺便说一句,优化器应该喜欢外连接,这大大减少了可能的连接顺序数量: - )

答案 2 :(得分:2)

内连接是可交换的,这意味着连接b = b连接a.Logical连接可能是内连接,但在执行计划中sql可能会尝试考虑嵌套循环,哈希或基于几个参数合并。没有物理连接是坏的,每个都有自己的优势。

您可以从您这边(最低限度)注意的一件事是尝试查看两个连接列是否已编入索引,sargabilty,无隐式转换。