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)
谢谢
以下只是一个很小的变化,但可能会加快速度:
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类型,并且运行时度量不受任何加载/读取/解析操作的影响。