我的查询中有4个全外连接,而且速度很慢,FULL OUTER JOIN
的顺序是否会影响性能/结果?
FULL OUTER JOIN =⋈
然后,
我有一个情况:A⋈B⋈C⋈D
所有连接都发生在所有A,B,C,D中包含的所有k
的公共密钥上
然后:
我觉得它不应该影响结果,但是会不会影响性能我不确定!
更新
假设结果集与订单无关,SQL Server会自动重新排列连接以获得更好的性能吗?
答案 0 :(得分:8)
不,重新排列JOIN订单不应影响性能。 MSSQL(与其他DBMS一样)具有query optimizer,其任务是为任何给定查询找到最有效的查询计划。一般来说,这些都做得非常好 - 所以你不太可能轻易击败优化器。
那就是说,他们偶尔会弄错。这就是reading an execution plan发挥作用的地方。您可以添加JOIN hints告诉MSSQL如何加入您的表(此时,订购 重要)。您通常会从最小到最大的表格进行排序(但是,使用FULL JOIN
,这可能不太重要)并按照rules of thumb进行连接类型。
由于您正在执行FULL JOINS
,因此您基本上是从磁盘上读取整个4个表。这可能非常昂贵。您可能需要重新检查问题,看看是否可以以不同的方式完成。
答案 1 :(得分:3)
不,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子句来限制表,那么您可能会经历数十万个结果。