我的任務是重新處理一組現有的舊查詢。我能找到的主要問題是它們都使用XML PATH()
在返回結果之前更新各種臨時表。SQL Server 2012:XML的替代路徑
它如此分解,我們創建一個臨時表,其基本信息爲不同的值。
OwnerId | FName | LName | Pets
--------+-------+-------+-------
PA1234 | Greg | Brady |
ZB0013 | Peter | Brady |
QX9999 | Bobby | Brady |
然後這個表需要從一個非常大的表 - 數百萬條記錄更新。這表看起來是這樣的:
PetId | OwnerId | PetType
------+---------+-----------
100 | PA1234 | cat
101 | PA1234 | dog, bird
103 | PA1234 | gerbil
104 | ZB0013 | fish
105 | QX9999 | dog, cat
106 | QX9999 | dog, bird
107 | AA5555 | snake
預期的結果會是這個樣子:
OwnerId | FName | LName | Pets
--------+-------+-------+-------------------------
PA1234 | Greg | Brady | cat; dog, bird; gerbil
ZB0013 | Peter | Brady | fish
QX9999 | Bobby | Brady | dog, cat; dog, bird
,因爲它代表產生預期的效果,但需要FOREVER查詢。 100條記錄需要將近5分鐘才能返回結果,這對我來說似乎很瘋狂。
UPDATE #Temp
SET Pets = STUFF((SELECT DISTINCT '; ' + P1.PetType
FROM Pet_Table P1
WHERE P1.OwnerID = OuterT.OwnerId
FOR XML PATH('')), 1, 1, '')
FROM #Temp OuterT
我覺得像COALESCE
會更快,但無法弄清楚如何使它在這種情況下工作,可能是CTE,我要找的任何建議。
謝謝,讓我知道是否需要更多的信息或我需要更好地解釋的東西。
您是否通過查看計劃確定FOX XML PATH確實是問題所在?你在其他表上有適當的索引嗎? – pmbAustin
@pmbAustin我認爲FOR XML PATH是個問題。我運行查詢W/O XML PATH,它需要約5秒鐘。使用XML PATH需要5分鐘。 –
使用[粘貼計劃@ brentozar.com](https://www.brentozar.com/pastetheplan/)分享您的執行計劃,這裏是說明:[如何使用粘貼計劃](https://www.brentozar的.com/pastetheplan /指令/)。 – SqlZim