SQL Server:完全外连接的顺序是什么?

时间:2012-05-21 11:43:13

标签: sql sql-server join

我的查询中有4个全外连接,而且速度很慢,FULL OUTER JOIN的顺序是否会影响性能/结果?

FULL OUTER JOIN =⋈

然后,

我有一个情况:A⋈B⋈C⋈D

所有连接都发生在所有A,B,C,D中包含的所有k的公共密钥上

然后:

  • 改变⋈连接的顺序会改变性能吗?
  • 是否会改变order的顺序改变结果?

我觉得它不应该影响结果,但是会不会影响性能我不确定!

更新

假设结果集与订单无关,SQL Server会自动重新排列连接以获得更好的性能吗?

3 个答案:

答案 0 :(得分:8)

不,重新排列JOIN订单不应影响性能。 MSSQL(与其他DBMS一样)具有query optimizer,其任务是为任何给定查询找到最有效的查询计划。一般来说,这些都做得非常好 - 所以你不太可能轻易击败优化器。

那就是说,他们偶尔会弄错。这就是reading an execution plan发挥作用的地方。您可以添加JOIN hints告诉MSSQL如何加入您的表(此时,订购 重要)。您通常会从最小到最大的表格进行排序(但是,使用FULL JOIN,这可能不太重要)并按照rules of thumb进行连接类型。

由于您正在执行FULL JOINS,因此您基本上是从磁盘上读取整个4个表。这可能非常昂贵。您可能需要重新检查问题,看看是否可以以不同的方式完成。

答案 1 :(得分:3)

  • 是否会改变order的顺序改变结果?

不,FULL JOIN的顺序无关紧要,结果将是相同的。但请注意,您不能使用类似的内容( 以下内容可能会根据联接的顺序提供不同的结果 ):

SELECT 
    COALESCE(a.id, b.id, c.id, d.id) AS id,  --- Key columns used in FULL JOIN
    a.*, b.*, c.*, d.*                       --- other columns                 
FROM a 
  FULL JOIN b
      ON b.id = a.id
  FULL JOIN c
      ON c.id = a.id
  FULL JOIN d
      ON d.id = a.id ;

你必须使用这样的东西( 无论连接顺序 ,结果没有差异):

SELECT 
    COALESCE(a.id, b.id, c.id, d.id) AS id,   
    a.*, b.*, c.*, d.*                                   
FROM a 
  FULL JOIN b
      ON b.id = a.id
  FULL JOIN c
      ON c.id = COALESCE(a.id, b.id) 
  FULL JOIN d
      ON d.id = COALESCE(a.id, b.id, c.id) ;

  • 改变⋈连接的顺序会改变性能吗?

考虑到第二个和第三个连接必须在列的COALESCE()而不是列本身上完成,我认为仅使用足够大的表进行测试将显示是否可以有效地使用索引。

答案 2 :(得分:0)

更改Full外连接的顺序不应影响性能或结果。根据Full Outer Join的顺序,唯一受影响的是使用SELECT *时生成的列的默认顺序。您可能只是尝试使用大型表进行多个连接时遇到性能问题。如果没有where子句来限制表,那么您可能会经历数十万个结果。