1. 程式人生 > >實戰演練(二):執行20小時的報表SQL優化後秒出

實戰演練(二):執行20小時的報表SQL優化後秒出

一、概述

這是我們SQL優化班的一個學員,據說該SQL在生產環境中已經運行了20個小時,快把伺服器的磁碟資源耗盡了。這20個小時,我們可愛的學員就是靠著刪除一些不重要的檔案才能夠勉強度過。 
據瞭解,該SQL為一個月執行一次的跑報表的SQL,主要問題是隨著SQL的執行時間越來越長,所需的臨時表空間也越來越大,導致磁碟資源用盡。

二、先看慢SQL

 ●  SQL 執行時長 ,目前已經20小時,還在繼續執行

 
  1. SELECT

  2. COUNT( * ) AS totalNum,

  3. sum( CASE WHEN F.ALARM_LEVEL = 1 THEN 1 ELSE 0 END ) AS LEVELS1,

  4. sum( CASE WHEN F.ALARM_LEVEL = 2 THEN 1 ELSE 0 END ) AS LEVELS2,

  5. sum( CASE WHEN F.ALARM_LEVEL = 3 THEN 1 ELSE 0 END ) AS LEVELS3,

  6. sum( CASE WHEN F.DEAL_STATE = 0 THEN 1 ELSE 0 END ) AS DESTS

  7. FROM

  8. F

  9. LEFT JOIN DC ON DC.ID = F.CONST_ID

  10. LEFT JOIN V ON V.ID = F.VEHICLE_ID

  11. LEFT JOIN AREA ON AREA.ID = V.SYS_DIVISION_ID

  12. WHERE

  13. DC.ID IS NOT NULL

  14. AND V.ID IS NOT NULL

  15. AND F.DEAL_STATE = 0

  16. AND ALARM_LEVEL IN ( 1, 2, 3 )

  17. AND F.VEHICLE_ID IN (

  18. SELECT

原文連結