Sql server SQL Server:使用XQuery优化TSQL查询
在SQL Server 2012中,我有一个包含一行的表,其中包含一个XML列-Sql server SQL Server:使用XQuery优化TSQL查询,sql-server,tsql,xquery,sqlxml,xquery-sql,Sql Server,Tsql,Xquery,Sqlxml,Xquery Sql,在SQL Server 2012中,我有一个包含一行的表,其中包含一个XML列-XMLdata。XML的大小约为10 MB。我写了一个查询,但执行大约需要1小时。有没有办法重写查询,使其运行得更快 XML的结构: <Settings> <Group Name="A"> <Group Name="AA"> <Group Name="AAA"> <Parameter
XMLdata
。XML的大小约为10 MB。我写了一个查询,但执行大约需要1小时。有没有办法重写查询,使其运行得更快
XML的结构:
<Settings>
<Group Name="A">
<Group Name="AA">
<Group Name="AAA">
<Parameter Name="aaa">
<Value>test1</Value>
<Items>
<Item Index="0" Name="A"/>
<Item Index="1" Name="B"/>
</Items>
</Parameter>
</Group>
</Group>
</Group>
</Settings>
尝试使用更加集中的XPath,而不是臭名昭著的效率低下的//Items
方法
我尝试了这一点,得到了相同的结果,并且性能更好:
SELECT
BlockPath = XC.value('../../../@Name', 'nvarchar(100)') + '/' + XC.value('../../@Name', 'nvarchar(100)') + '/' + XC.value('../@Name', 'nvarchar(100)'),
ParameterName = XC.value('@Name', 'varchar(100)'),
ItemIndex = XCItem.value('@Index', 'int'),
ItemName = XCItem.value('@Name', 'varchar(100)')
FROM
[table]
CROSS APPLY
XMLdata.nodes('/Settings/Group/Group/Group/Parameter') AS XT(XC)
CROSS APPLY
XC.nodes('Items/Item') AS XT2(XCItem);
第一个CROSS-APPLY
获取
节点,但其中包含包含任何/
的直接XPath,然后第二个CROSS-APPLY
获取每个
节点下的项/项
节点
试试这个-你得到了多少改进?试着使用更加专注的XPath,而不是臭名昭著的低效//Items
方法
我尝试了这个,得到了同样的结果,而且性能更好:
SELECT
BlockPath = XC.value('../../../@Name', 'nvarchar(100)') + '/' + XC.value('../../@Name', 'nvarchar(100)') + '/' + XC.value('../@Name', 'nvarchar(100)'),
ParameterName = XC.value('@Name', 'varchar(100)'),
ItemIndex = XCItem.value('@Index', 'int'),
ItemName = XCItem.value('@Name', 'varchar(100)')
FROM
[table]
CROSS APPLY
XMLdata.nodes('/Settings/Group/Group/Group/Parameter') AS XT(XC)
CROSS APPLY
XC.nodes('Items/Item') AS XT2(XCItem);
第一个CROSS-APPLY
获取
节点,但其中包含包含任何/
的直接XPath,然后第二个CROSS-APPLY
获取每个
节点下的项/项
节点
试试这个-你有多大的改进?正如评论中所建议的,在你的专栏上创建是个好主意。您还可以按照marc_的建议查询XML字段。这两者的结合应该会给你带来巨大的性能提升。正如评论中所建议的,在你的专栏上创建一个好主意。您还可以按照marc_的建议查询XML字段。这两者的结合应该会给您带来巨大的性能提升。您是否尝试过查看xml索引?谢谢你的建议。我快速提高了性能。您是否尝试查看xml索引?谢谢你的建议。我迅速提高了性能。我用我的代码和你的代码选择了前100名。我的密码花了78秒,你的密码花了47秒。我添加了主XML索引和辅助XML索引,并迅速提高了性能<代码>选择前100名需要3秒钟才能执行。@AljPra:好的,很高兴听到这个消息。我在XML索引方面的经验不太好——它们确实加快了XQuery的速度,但它们也使我的数据库从大约1.5 GB的大小膨胀到大约11 GB的大小……我在我的代码和您的代码中使用了
SELECT TOP 100
。我的密码花了78秒,你的密码花了47秒。我添加了主XML索引和辅助XML索引,并迅速提高了性能<代码>选择前100名需要3秒钟才能执行。@AljPra:好的,很高兴听到这个消息。我在XML索引方面的经验不太好——它们确实加快了XQuery的速度,但它们也使我的数据库从大约1.5 GB的大小膨胀到大约11 GB的大小。。。。。