2017-01-31 145 views
0

我遇到了一個奇怪的性能問題。我有一個基於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%,直到查詢結束運行,無論是單獨運行還是由管理員停止。

我希望有人有一些想法,什麼原因可能造成這一點。它似乎是從哪裏冒出來的。

+1

您運行的是什麼版本的SQL Server?如果你在2012年以上,看起來像是使用LEAD/LAG的好選擇。 –

回答

1

再次,很奇怪的方面是,這只是開始3天前

我建議所涉及的表更新的統計數據,也嘗試重建索引

在出現瓶頸LEFT OUTER JOIN回CTE

CTE不會有任何統計數據,我會建議materalizingŧ他CTE到一個臨時表,看看這有助於

+0

重建索引!謝謝!如果可能的話,爲什麼會影響INNER JOIN Vs.的表現?數據的內存表示的左外連接? – UncleJasper75

+0

更改加入的原因優化器採取的掃描不同的路徑或尋求,這還基於可用的 – TheGameiswar

+0

@ UncleJasper75統計:還請執行後的計劃,展望未來 – TheGameiswar