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 看看是否有帮助
我遇到了 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 看看是否有帮助