【问题标题】:Xml query with cross join on large dataset. how to increase performance在大型数据集上使用交叉连接的 XML 查询。如何提高性能
【发布时间】:2011-12-05 15:36:50
【问题描述】:

我有以下查询,100 条记录大约需要 50 秒,但是使用计数我确定结果集将是 100 000 项 (这是为了报告)所以我正在寻找提高性能的方法。

SELECT TOP 200
OL.*,
LI.LineItem.value('Field[@name="storename"][1]/@value', 'varchar(MAX)') AS storename,
LI.LineItem.value('Field[@name="pwnumber"][1]/@value', 'varchar(MAX)') AS pwnumber,
LI.LineItem.value('Field[@name="department"][1]/@value', 'varchar(MAX)') AS department,
LI.LineItem.value('Field[@name="item"][1]/@value', 'varchar(MAX)') AS item,
LI.LineItem.value('Field[@name="barcode"][1]/@value', 'varchar(MAX)')AS barcode,
LI.LineItem.value('Field[@name="oldprice"][1]/@value', 'varchar(MAX)')AS oldprice,
LI.LineItem.value('Field[@name="newprice"][1]/@value', 'varchar(MAX)')AS newprice,
LI.LineItem.value('Field[@name="goodsgroup"][1]/@value', 'varchar(MAX)')AS goodsgroup,
LI.LineItem.value('Field[@name="startdate"][1]/@value', 'varchar(MAX)')AS startdate,
LI.LineItem.value('Field[@name="prodgroup"][1]/@value', 'varchar(MAX)')AS prodgroup,
LI.LineItem.value('Field[@name="season"][1]/@value', 'varchar(MAX)')AS season,
LI.LineItem.value('Field[@name="pkquantity"][1]/@value', 'varchar(MAX)')AS pkquantity,
LI.LineItem.value('Field[@name="recordtype"][1]/@value', 'varchar(MAX)')AS recordtype
FROM [lines] OL
LEFT JOIN [Clineextension] OLE ON OL.OrderLineId = OLE.OrderLineId
CROSS APPLY OLE.LineItems.nodes('/LineItems/LineItem') as LI(LineItem)
WHERE Customer = 1302
AND StatusId > 1

我认为特别是选择语句可以改进,但我不确定如何。

有什么想法吗? 非常感谢任何帮助。

其他信息 sql server 2005 所有权利 xml 字段因客户而异

【问题讨论】:

标签: sql-server xml sql-server-2005 xpath


【解决方案1】:

在 XML 列上使用索引,性能将大幅提升。

【讨论】:

  • 这确实是一个巨大的性能提升(在 qa 系统上),但是我们决定简单地使用一个应用程序来加载完整的 xml,然后在应用程序中构建一个报告,因为这很容易实现在我们现有的框架上,并且比在超过数百万条记录表上构建一个 xml 索引花费更少的时间,每个记录有很多 xml
猜你喜欢
  • 2015-05-12
  • 2012-07-13
  • 2021-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-26
  • 2012-04-19
相关资源
最近更新 更多