2014-11-17 60 views
0

我最近已經注意到,執行一個包含許多連接的查詢比執行這些連接的執行時間要長得多。更具體地講:SQL(tsql) - 加入

SELECT a.*, b.A, c.A, d.A 
FROM a 
LEFT JOIN 
b 
on a.A = b.A or a.B = b.A 
LEFT JOIN 
c 
on a.A = c.A or a.B = c.A 
LEFT JOIN 
d 
on a.A = d.A or a.B = d.A 

注意到時間的宇宙量完成,同時做加入的每一個步驟,並保存到一個表,真的需要很短的時間。整個查詢的工作時間爲1:30小時,並且完成時間不長((((a-> b) - > c) - > d)總共需要3分鐘。

這是什麼原因,有人可以幫忙嗎?

+0

請編輯你的問題,並解釋一點更好的選項,爲您工作得更快。 – JotaBe

回答

0

問題不在於一般的鏈接join。問題是or。我建議寫這篇爲:

SELECT a.*, coalesce(b1.A, b2.A) as A, coalesce(c1.A, c2.A), . . . 
FROM a LEFT JOIN 
    b1 
    on a.A = b1.A LEFT JOIN 
    b2 
    on a.B = b2.A LEFT JOIN 
    c1 
    on a.A = c1.A LEFT JOIN 
    c2 
    on a.B = c2.A LEFT JOIN 
    . . . 

,如果你有在每個表中最多隻有一個匹配這應返回類似的結果。如果or中的每個條件與另一行匹配,則您的版本可以生成多行。

1

檢查查詢計劃
我懷疑你正在進入一個循環連接
它傾向於做一個循環連接,只要你有一個以上的連接條件
嘗試暗示

SELECT a.*, b.A, c.A, d.A 
    FROM a 
    LEFT OUTER HASH JOIN b 
    on a.A = b.A 
    or a.B = b.A 
    LEFT OUTER HASH JOIN c 
    on a.A = c.A 
    or a.B = c.A 
    LEFT OUTER HASH JOIN d 
    on a.A = d.A 
    or a.B = d.A 

這可能工作 - 但我懷疑它

SELECT a.*, b.A, c.A, d.A 
    FROM a 
    LEFT OUTER HASH JOIN b 
    on b.A in (a.A, a.B) 
    ...