2012-09-05 92 views
0

我有一個查詢SQL查詢利用FOR XML

SELECT Brand, 
     UEI_ID, 
     Concat_Prd_Id = Stuff((
         SELECT ',' + CAST(Second_ID AS VARCHAR(max)) 
         FROM Temp1 t2 
         WHERE t1.Brand = t2.Brand 
           AND t1.UEI_ID = t2.UEI_ID 
         FOR XML Path('') 
         ), 1, 1, '') 
FROM Temp1 t1 
GROUP BY Brand, 
     UEI_ID 

這是服用8.48敏於執行26000條記錄。

請讓我知道如何減少時間......?

+1

你有這個專欄'品牌'的索引? –

+0

請發佈執行計劃。 –

+0

...和'UEI_ID'? – Yaroslav

回答

2

首先添加一個索引,(depeneding其他查詢您使用的參考表),像下面應該這樣做:

CREATE NONCLUSTERED INDEX IX_Temp1 ON Temp1 (Brand, UEI_ID) INCLUDE Second_ID 

儘管我不認爲它適用於您的情況,因爲Second_ID可能是一個整數,並且不會縮短執行時間,但使用XML value以考慮連接具有特殊字符的字符串。

例如,

SELECT Brand, 
     UEI_ID, 
     Concat_Prd_Id = STUFF((
         SELECT ',' + CAST(Second_ID AS VARCHAR(MAX)) 
         FROM Temp1 t2 
         WHERE t1.Brand = t2.Brand 
           AND t1.UEI_ID = t2.UEI_ID 
         FOR XML PATH(''), TYPE 
         ).value('.', 'NVARCHAR(MAX)', 1, 1, '') 
FROM Temp1 t1 
GROUP BY Brand, 
     UEI_ID 
+0

聽到品牌和UEI_ID有dublicate數據,所以我不能添加索引 – user1632718

+0

索引不必是唯一的,所以有沒有理由不索引他們。 – GarethD

+0

嗨,我試圖創造領域的索引,但有錯誤。由於數據類型的大小(它是nvarchar(Max))。我改變了大小並添加了索引現在查詢速度要快得多,謝謝 – user1632718

1

如果您尚未在BRANDUEI_ID上添加Index,則可以使用此語法更改該表。

ALTER TABLE tablename ADD INDEX indexName (columnName); 

所以你的情況,你可以這樣做

ALTER TABLE Temp1 ADD INDEX IDX_Brand (Brand); 
ALTER TABLE Temp1 ADD INDEX IDX_UEI_ID (UEI_IDd); 
+0

品牌和UEI_ID列不是唯一的表 – user1632718