[英]SQL Server 2012 : alternative to XML PATH
我的任务是重新处理一组现有的旧查询。 我可以找到的主要问题是它们都使用XML PATH()
在返回结果之前对各种临时表进行更新。
像这样分解,我们创建一个临时表,将基本信息作为不同的值。
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)使其工作,我正在寻找任何建议。
谢谢,让我知道是否需要更多信息,或者我需要更好地解释。
五分钟(100条记录)太慢。 我怀疑您可能永远无法获得想要的性能。 但是,索引会有所帮助。
首先,您需要正确表达查询语句。 您需要在UPDATE
指定OuterT
,因为对#Temp
的两个引用是不同的。 您的版本实质上是在进行CROSS JOIN
。
UPDATE OuterT
SET Pets = STUFF((SELECT DISTINCT '; ' + P1.PetType
FROM Pet_Table P1
WHERE P1.OwnerID = OuterT.OwnerId
FOR XML PATH('')
), 1, 1, '')
FROM #Temp OuterT;
然后,您需要索引。 对于此查询: Pet_Table(OwnerId, PetType)
。
另外,如果您可以摆脱SELECT DISTINCT
的SELECT DISTINCT
那也将有所帮助。
通过查看计划,您是否确定FOX XML PATH确实是问题所在? 在其他表上是否有适当的索引?
FOR XML PATH通常是高性能的,而且我从未见过它会导致您在此处确定的范围降低。 相反,我将查看计划,并更深入地研究正在使用(或未使用)哪些索引,并查看调整索引(添加INCLUDE列)或添加新索引是否可以解决您的问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.