我遇到了一个奇怪的性能问题。我有一个基于CTE的观点。这是我多年前写的一个观点,它一直没有问题。突然,4天前,在我们确定长时间运行的查询并暂停查询之前,运行了1到2分钟的查询运行了几个小时。
CTE生成代理执行的时间戳记的事务列表。然后我从CTE中选择,使用后续交易的时间戳连接回CTE,以确定代理在每笔交易上花费的时间长度。
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记录。这是正常的运行时间帧。)如果我使用简单的SELECT * FROM [CTE_TABLE]运行CTE,它也会在不到一秒的时间内运行。当我使用INNER JOIN将其运行回自身时,再次运行不到一秒钟。最后,当我将其作为LEFT OUTER JOIN运行时,仅需要一个半分钟就可以获得单个代理的500条记录。我需要LEFT OUTER JOIN,因为当天的最终记录是代理人注销系统,它从来没有记录要加入。
我从中获取的表格大小超过22GB,并且有5亿行。从一张表中选择一天的记录需要14秒,或者在不到一秒的时间内选择一个代理,因此我不认为性能瓶颈来自源表。瓶颈发生在LEFT OUTER JOIN回到CTE,但我总是有LEFT OUTER JOIN。同样,非常奇怪的是,这只是在4天前开始的。我已经检查了服务器上的空间,有很多。 CPU达到约。 25%并保持在那里,直到查询结束运行,可以单独运行,也可以由管理员暂停。
我希望有人对可能导致这种情况的原因有所了解。它似乎从无处突然出现。
答案 0 :(得分:1)
同样,非常奇怪的是,这只是在4天前开始的
我建议更新所涉及的表的统计信息,并尝试重建索引
瓶颈发生在LEFT OUTER JOIN回到CTE
CTE将没有任何统计数据,我建议将CTE重新定位到Temp表中以查看是否有帮助