我遇到了一個奇怪的性能問題。我有一個基於CTE的觀點。這是我多年前寫的一個觀點,它一直沒有問題地運行。突然之間,4天前,在1-2分鐘內運行的查詢運行了幾個小時,然後我們確定了長時間運行的查詢並暫停了查詢。SQL Server LEFT OUTER JOIN查詢性能
的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的大小,並有500萬行。從這張表中選擇一天的記錄需要14秒,或者一秒鐘內的單個代理,所以我不認爲性能瓶頸來自源表。瓶頸發生在LEFT OUTER JOIN回到CTE,但我一直有LEFT OUTER JOIN。再次,非常奇怪的是,這只是4天前開始的。我檢查了服務器上的空間,有很多。 CPU尖峯到約。 25%,直到查詢結束運行,無論是單獨運行還是由管理員停止。
我希望有人有一些想法,什麼原因可能造成這一點。它似乎是從哪裏冒出來的。
您運行的是什麼版本的SQL Server?如果你在2012年以上,看起來像是使用LEAD/LAG的好選擇。 –