减少连接到 SQLXML 的执行时间 table
Reducing execution time of join to SQLXML table
我有一个大型 T-SQL 存储过程,其中包含 3 个到 SELECT
语句的连接,这些语句查询作为参数传入的 XML 值。
参数如下所示:
@Code xml = NULL
联接看起来像这样:
AND (@Code IS NULL OR (t.Code IN (
select Tbl.Col.value('.[1]', 'nvarchar(2)')
from @Code.nodes('//codes/code') Tbl(Col)
)))
参数值的示例是:
'<codes><code>GB</code></codes>'
这些块中可能有多达 100 个 <code>...</code>
个元素。
执行计划中显示的每个元素都显示 Cost: 0 %
除了这些连接显示 Cost: 49 %
.
我可以做些什么来缩短执行时间?
一般//
后代轴比较慢,尽量使用正常的/
子轴
另外,使用.
获取节点值也很慢,最好使用text()
您可以执行以下语法之一,这可能比您所拥有的更快
AND (@Code IS NULL OR
@Code.exist('/codes/code[text() = sql:column("t.Code")]')) = 1
)
-- or better
AND ISNULL(@Code.exist('/codes/code[text() = sql:column("t.Code")]'), 1) = 1
AND (@Code IS NULL OR (t.Code IN (
select Tbl.Col.value('text()[1]', 'nvarchar(2)')
from @Code.nodes('/codes/code') Tbl(Col)
)))
我有一个大型 T-SQL 存储过程,其中包含 3 个到 SELECT
语句的连接,这些语句查询作为参数传入的 XML 值。
参数如下所示:
@Code xml = NULL
联接看起来像这样:
AND (@Code IS NULL OR (t.Code IN (
select Tbl.Col.value('.[1]', 'nvarchar(2)')
from @Code.nodes('//codes/code') Tbl(Col)
)))
参数值的示例是:
'<codes><code>GB</code></codes>'
这些块中可能有多达 100 个 <code>...</code>
个元素。
执行计划中显示的每个元素都显示 Cost: 0 %
除了这些连接显示 Cost: 49 %
.
我可以做些什么来缩短执行时间?
一般//
后代轴比较慢,尽量使用正常的/
子轴
另外,使用.
获取节点值也很慢,最好使用text()
您可以执行以下语法之一,这可能比您所拥有的更快
AND (@Code IS NULL OR
@Code.exist('/codes/code[text() = sql:column("t.Code")]')) = 1
)
-- or better
AND ISNULL(@Code.exist('/codes/code[text() = sql:column("t.Code")]'), 1) = 1
AND (@Code IS NULL OR (t.Code IN (
select Tbl.Col.value('text()[1]', 'nvarchar(2)')
from @Code.nodes('/codes/code') Tbl(Col)
)))