减少连接到 SQLXML 表的执行时间
Posted
技术标签:
【中文标题】减少连接到 SQLXML 表的执行时间【英文标题】:Reducing execution time of join to SQLXML table 【发布时间】:2021-12-01 19:13:03 【问题描述】:我有一个大型 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 %
。
我可以做些什么来缩短执行时间?
【问题讨论】:
我建议你使用表值参数,它可能会表现更好 【参考方案1】:一般//
后代轴比较慢,尽量使用正常的/
子轴。
另外,使用.
检索节点值也很慢,最好使用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)
)))
【讨论】:
以上是关于减少连接到 SQLXML 表的执行时间的主要内容,如果未能解决你的问题,请参考以下文章
如何连接到远程 Windows 机器以使用 python 执行命令?
mybatis 是在啥时候连接到数据库的,是在服务器启动时连接还是执行sql语句时候连接?