SQL Server外部应用查询优化

时间:2018-10-26 15:55:50

标签: sql sql-server query-optimization outer-apply sql-cte

我有两个表-表A和表B。

表A具有121,903行。表B只有95行。

我需要将表A与表B连接起来,这样我将获得表B的第一行,该行具有按排序标准与表A顺序匹配的行。

我正在使用以下查询来获取结果。它可以正确返回结果,但是存在性能问题。

;WITH [TableAB] AS
(
    SELECT * FROM #TableA A
    OUTER APPLY
    (
        SELECT TOP 1 *  FROM #TableB
        WHERE 
            ([Col1] = A.[Col1]OR [Col1]IS NULL)
        AND ([Col2] = A.[Col2]OR [Col2]IS NULL)
        AND ([Col3] = A.[Col3]OR [Col3]IS NULL)
        AND ([Col4] = A.[Col4]OR [Col4]IS NULL)
        AND ([Col5] = A.[Col5] OR [Col5] IS NULL)
        AND ([Col6] = A.[Col6]OR [Col6]IS NULL)
        AND ([Col7] = A.[Col7]OR [Col7]IS NULL)
        AND ([Col8] = A.[Col8]OR [Col8]IS NULL)
        AND ([Col9] IS NULL)
        AND ([Col10] IS NULL)
        AND ([Col11] = A.[Col11] OR [Col11] IS NULL)
        AND ([Col12] = A.[Col12]OR [Col12] IS NULL)
        AND ([Col13] = A.[Col13]OR [Col13]IS NULL)
        AND ([Col14] = A.[Col14] OR [Col14] IS NULL)
        AND ([Col15]= A.[Col15]OR [Col15]IS NULL)
        AND ([Col16] = A.[Col16] OR [Col16] IS NULL)
        AND ([Col17]= A.[Col17]OR [Col17]IS NULL)
        AND ([Col18]= A.[Col18]OR [Col18]IS NULL)
        AND ([Col19]= A.[Col19]OR [Col19]IS NULL)
        AND ([Col20] = A.[Col20] OR [Col20]IS NULL)
        ORDER BY [SortCriteria]
    ) B
)
SELECT * FROM [TableAB]

Query Plan

当前大约需要1分钟才能执行此查询。有什么方法可以重写查询以提高性能?

请注意,这是一个数据仓库系统,以上查询是使用CTE表“ TableAB”的大型查询的一部分。

谢谢。

1 个答案:

答案 0 :(得分:1)

由于执行的大部分时间都花在对TableB进行排序上,因此最有可能提高性能的方法是添加一个覆盖SortCriteria的索引,并将TableB中的所有列包括在内在查询中被选中。