繁体   English   中英

SQL Server 2012:XML PATH的替代方法

[英]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 DISTINCTSELECT DISTINCT那也将有所帮助。

通过查看计划,您是否确定FOX XML PATH确实是问题所在? 在其他表上是否有适当的索引?

FOR XML PATH通常是高性能的,而且我从未见过它会导致您在此处确定的范围降低。 相反,我将查看计划,并更深入地研究正在使用(或未使用)哪些索引,并查看调整索引(添加INCLUDE列)或添加新索引是否可以解决您的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM