2012-09-05 59 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