SQL 服务器 LEFT OUTER JOIN 查询性能

SQL Server LEFT OUTER JOIN Query Performance

我遇到了 st运行ge 性能问题。我有一个基于 CTE 的观点。这是我多年前写的观点,运行 一直没有问题。突然,4 天前,查询 运行 在 1 - 2 分钟内 运行 几个小时,然后我们确定了长 运行ning 查询并将其停止。

CTE 生成带有时间戳的列表,包含代理执行的 t运行 操作。然后我从 CTE Select,使用后续 t运行saction 的时间戳返回 CTE,以确定代理在每个 t运行saction 上花费的时间长度。

WITH [CTE_TABLE] (COLUMNS) AS
    (
    SELECT [INDEXED COLUMNS]
         ,[WINDOWED FUNCTION] AS ROWNUM
    FROM [DB_TABLE]
    WHERE [EMPLOYEE_ID] = 111213
    )

    SELECT [T1].[EMPLOYEE_ID]
        ,[T1].[TRANSACTION_NAME]
        ,[T1].[TIMESTAMP]          AS [START_TIME]
        ,[T2].[TIMESTAMP]          AS [END_TIME]
    FROM [CTE_TABLE] [T1]
         LEFT OUTER JOIN [CTE_TABLE] [T2] ON
            (
            [T1].[EMPLOYEE_ID] = [T2].[EMPLOYEE_ID]
            AND [T1].[ROWNUM]  = [T2].[ROWNUM] + 1
            )

在测试中,我过滤特定代理。如果它 运行 CTE 的内部部分,它会在不到一秒的时间内生成 500 条记录。 (当不过滤单个代理时,它会在 14 秒内生成 95K 条记录。这是正常的 运行ning 时间范围。)如果我 运行 使用简单的 SELECT * FROM [ CTE_TABLE],它也在不到一秒的时间内 运行。当我 运行 它使用 INNER JOIN 回到自身时,再次 运行s 不到一秒钟。最后,当我 运行 将其作为 LEFT OUTER JOIN 时,仅一个代理的 500 条记录就需要一分半钟。我需要 LEFT OUTER JOIN,因为当天的最终记录是代理注销系统,并且它从来没有要加入的记录。

我从中提取的 table 大小超过 22GB,有 5 亿行。 Select从这个 table 读取记录一天需要 14 秒,或者单个代理不到一秒,所以我不认为性能瓶颈来自源头 table.瓶颈出现在返回 CTE 的 LEFT OUTER JOIN 中,但我一直使用 LEFT OUTER JOIN。同样,非常 st运行ge 方面是这仅在 4 天前开始。我检查了服务器上的space,有很多。 CPU 飙升至约。 25% 并一直保持到查询结束 运行ning,无论是自行结束,还是被管理员停止。

我希望有人对造成这种情况的原因有一些想法。好像是凭空冒出来的。

Again, the very strange aspect is that this only began 4 days ago

我建议更新有关 table 的统计信息并尝试重建索引

The bottleneck occurs in the LEFT OUTER JOIN back to the CTE

CTE 没有任何统计数据,我建议将 CTE 物质化为临时 table 看看是否有帮助