Sql server SQL Server:使用XQuery优化TSQL查询

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

在SQL Server 2012中,我有一个包含一行的表,其中包含一个XML列-
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的大小。。。。。