2013-05-07 51 views
1

我需要關於如何分解這個查詢的建議,所以它不那麼慢。我一直在閱讀EXISTS和UNION,但我不確定如何在這種情況下使用它們。 LineA/B/C都是nvarchar(max),我不能將連接更改爲除文本外的其他內容。必須排隊,不幸的是。TSQL - 關於如何在JOIN中分解OR條件的建議

UPDATE n SET AddressID = a.AddressID 
FROM #NewAddress n 
JOIN dbo.Address a 
    ON (a.[LineA] = n.[LineA] OR (a.[LineA] is null AND n.[LineA] is null)) 
    AND (a.[LineB] = n.[LineB] OR (a.[LineB] is null AND n.[LineB] is null)) 
    AND (a.[LineC] = n.[LineC] OR (a.[LineC] is null AND n.[LineC] is null)) 
WHERE n.Processed = 0 

如何UNION任何意見或存在此查詢?這似乎是一個很常見的連接條件我遇到

我不知道如何發佈查詢計劃,但像他這樣

SELECT 0% <---- Hash Match (Inner Join) 75% <------- Clustered Index Scan 0% 
              <------- Clustered Index Scan 25% 

這些行沒有被索引,因爲他們是真正的小是nvarchar(最大)。我不能索引dbo.Address要麼

- 已解決

我#NewAddress添加一個索引到處理的列。顯然,這是緩慢的部分

+0

可以'LineA'真的爲空?如果'LineA'的意思是'AddressLine1',我對您的數據完整性持懷疑態度...... – canon 2013-05-07 18:49:16

+2

發佈查詢計劃。 – kenchilada 2013-05-07 18:49:19

+0

是的,它可以爲空。非常粗略,我知道。這是我已經處理的手 – user1002479 2013-05-07 18:57:06

回答

0

你真的不能太大改善查詢索引沒有,但使用的語法如下:

SELECT * 
FROM a 
JOIN b 
ON  EXISTS 
     (
     SELECT a.lineA, a.lineB, a.lineC 
     INTERSECT 
     SELECT b.lineA, b.lineB, b.lineC 
     ) 

你給使用MERGE JOIN理論上可以更有效地優化能力。

看到這個SQLFiddle(實際MERGE JOIN在計劃)

+0

奇怪地產生相同的查詢計劃。非常有趣的方法 – user1002479 2013-05-07 19:31:01

+0

@ user1002479:嘗試強制另一個連接方法(用'INNER MERGE JOIN'替換'JOIN') – Quassnoi 2013-05-07 19:32:48