gpt4 book ai didi

sql-server - 如何优化“XQuery” SQL

转载 作者:行者123 更新时间:2023-12-03 16:29:21 26 4
gpt4 key购买 nike

我在具有10,000条记录的表的XML类型列中具有这样的XML层次结构-

<Root>
<Elem1>
<Parent1>
<Separator>
<Child1/>
</Separator>
</Parent1>
</Elem1>
</Root>




我有这样的查询-

DECLARE @Root VARCHAR(50)
DECLARE @Entity VARCHAR(50)
DECLARE @ParentNode VARCHAR(50)
DECLARE @Separator VARCHAR(50)
DECLARE @ChildNode VARCHAR(50)


SET @Root = 'Root'
SET @Entity = 'Elem1'
SET @ParentNode = 'Parent1'
SET @Separator = 'separator'
SET @ChildNode = 'Child1'

select Parent.P.value('.', 'varchar(max)') as MyValue,
T.uniqueId, T.XMLCol
from [XMLTable] as T
cross apply
(SELECT
XMLTable.XMLCol.query('(/*[local-name()=sql:variable("@Root")]/*[local-name(.)=sql:variable("@Entity")]/*[local-name(.)=sql:variable("@ParentNode")]/*[local-name(.)=sql:variable("@Separator")]/*[local-name(.)=sql:variable("@ChildNode")])[1]'
) as Parent(P)


如何进一步优化此查询。目前,这需要2秒钟,如果我再做一次INNER JOINS,它总共需要花费时间。我尝试在XML列上创建一个PRIMARY索引,但这需要更多时间!

编辑-如果我对路径进行硬编码而不是使用变量,则只需不到一秒钟。但是,我希望它在表值函数中并且不能对路径进行硬编码?



编辑-解决方案

select x.value('(Parent1/Separator1/Child1)[1]', 'varchar(max)') as Col1,
x.value('(Parent2/Separator2/Child2)[1]', 'varchar(max)') as Col2,
x.value('(Parent3)[1]', 'varchar(max)') as Col3
from [XMLTable] T
cross apply T.XMLCOL.nodes('/Root/Elem1') a(x)


上面的查询大约需要一秒钟。它似乎是最快的。因此,可以使用 ADO.NET功能动态地准备和执行上面的查询,而不是使用带参数的表值函数

请纠正我...?

最佳答案

如果只希望每行中有一个值,则无需使用cross apply

select XMLCol.value('(/*[local-name()=sql:variable("@Root")]
/*[local-name(.)=sql:variable("@Entity")]
/*[local-name(.)=sql:variable("@ParentNode")]
/*[local-name(.)=sql:variable("@Separator")]
/*[local-name(.)=sql:variable("@ChildNode")])[1]', 'varchar(max)')
from XMLTable


获得相同结果的另一种方法是使用 FLWOR。在我的有限测试中,这将运行得更快。

select XMLCol.value('(for $n1 in /*,
$n2 in $n1/*,
$n3 in $n2/*,
$n4 in $n3/*,
$n5 in $n4/*
where $n1[local-name(.) = sql:variable("@Root")] and
$n2[local-name(.) = sql:variable("@Entity")] and
$n3[local-name(.) = sql:variable("@ParentNode")] and
$n4[local-name(.) = sql:variable("@Separator")] and
$n5[local-name(.) = sql:variable("@ChildNode")]
return $n5
)[1]', 'varchar(max)')
from XMLTable

关于sql-server - 如何优化“XQuery” SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7064207/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com