读取大型数据集的XML节点时出现交叉应用的性能问题

问题描述 投票:-1回答:1

XML交叉应用的性能问题:

DataTable有1300个条目,而字段xmldata有250个节点,因此查询正在运行1300 * 250次以带来输出,并且执行时间要花费一些时间才能生成325000行。大型数据集是否会遇到类似的问题?非常感谢您的帮助。

示例XML:

<dataModel>
  <Colum1>
    <value />
    <displayText />
    <controltype>textbox</controltype>
    <label>Field1</label>
    <controlid>4458575-b0d3-ff4d-01ac-5447e21234dd</controlid>
  </Colum1>
  <Colum2>
    <value />
    <displayText />
    <controltype>textbox</controltype>
    <label>Field2</label>
    <controlid>5a5b7b7e-7b66-1f0d-a562-9d0660a74e11</controlid>
  </Colum2>
....
</dataModel>

select  t.c.value('(local-name(.))[1]', 'nvarchar(100)') as keyname ,
        t.c.value('(controlid)[1]', 'nvarchar(200)') as controlid,
        t.c.value('(label)[1]', 'nvarchar(500)') as label
from DataTable xmldata 
CROSS APPLY xmldata .nodes('/dataModel/*') T(c)

谢谢

sql xml sqlperformance cross-apply
1个回答
0
投票
您的方法似乎很简单。没有足够的空间进行增强...

以下只是一个很小的变化,但可能会加快速度:

declare @tbl TABLE(ID INT IDENTITY, xmldata XML); INSERT INTO @tbl VALUES (N'<dataModel> <Colum1> <value /> <displayText /> <controltype>textbox</controltype> <label>Field1</label> <controlid>4458575-b0d3-ff4d-01ac-5447e21234dd</controlid> </Colum1> <Colum2> <value /> <displayText /> <controltype>textbox</controltype> <label>Field2</label> <controlid>5a5b7b7e-7b66-1f0d-a562-9d0660a74e11</controlid> </Colum2> </dataModel>'); select t.c.value('(local-name(.))[1]', 'nvarchar(100)') as keyname , t.c.value('(controlid/text())[1]', 'nvarchar(200)') as controlid, t.c.value('(label/text())[1]', 'nvarchar(500)') as label from @tbl xmldata CROSS APPLY xmldata .nodes('/dataModel/*') T(c);

我将/text()添加到您的XPath中(找到details here)。

告诉我们,您使用/text(),大约遇到了多少差异。

并且很重要:XML的一个非常昂贵的部分是初始解析。确保该表的列本机为xml类型,并且运行时度量不受任何加载/读取/解析操作的影响。

© www.soinside.com 2019 - 2024. All rights reserved.