實戰演練(二):執行20小時的報表SQL優化後秒出
阿新 • • 發佈:2018-11-05
一、概述
這是我們SQL優化班的一個學員,據說該SQL在生產環境中已經運行了20個小時,快把伺服器的磁碟資源耗盡了。這20個小時,我們可愛的學員就是靠著刪除一些不重要的檔案才能夠勉強度過。
據瞭解,該SQL為一個月執行一次的跑報表的SQL,主要問題是隨著SQL的執行時間越來越長,所需的臨時表空間也越來越大,導致磁碟資源用盡。
二、先看慢SQL
● SQL 執行時長 ,目前已經20小時,還在繼續執行
-
SELECT
-
COUNT( * ) AS totalNum,
-
sum( CASE WHEN F.ALARM_LEVEL = 1 THEN 1 ELSE 0 END ) AS LEVELS1,
-
sum( CASE WHEN F.ALARM_LEVEL = 2 THEN 1 ELSE 0 END ) AS LEVELS2,
-
sum( CASE WHEN F.ALARM_LEVEL = 3 THEN 1 ELSE 0 END ) AS LEVELS3,
-
sum( CASE WHEN F.DEAL_STATE = 0 THEN 1 ELSE 0 END ) AS DESTS
-
FROM
-
F
-
LEFT JOIN DC ON DC.ID = F.CONST_ID
-
LEFT JOIN V ON V.ID = F.VEHICLE_ID
-
LEFT JOIN AREA ON AREA.ID = V.SYS_DIVISION_ID
-
WHERE
-
DC.ID IS NOT NULL
-
AND V.ID IS NOT NULL
-
AND F.DEAL_STATE = 0
-
AND ALARM_LEVEL IN ( 1, 2, 3 )
-
AND F.VEHICLE_ID IN (
-
SELECT