减少连接到 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)
    )))