减少连接到 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 个 &lt;code&gt;...&lt;/code&gt; 元素。

执行计划中显示的每个元素都显示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语句时候连接?

无法连接到我的 SQL Server 数据库?

推迟执行连接到控制事件的 Javascript 以支持外部 jQuery 函数

如何在连接到远程系统的设备上部署和执行应用程序?