高水位線下空閒塊過多導致的SQL效能問題

OGG-01161發表於2012-12-31
     最近在給某客戶資料庫做巡檢,從AWR報告中,看到如下一條語句:
SELECT ODS_WZ_MKPF.MBLNR, ODS_WZ_MKPF.MJAHR, ODS_WZ_MKPF.BLART, ODS_WZ_MKPF.CPUDT, ODS_WZ_MKPF.USNAM, ODS_WZ_MSEG.ZEILE, ODS_WZ_MSEG.BWART, ODS_WZ_MSEG.WERKS, ODS_WZ_MSEG.RSNUM FROM ODS_WZ_MKPF, ODS_WZ_MSEG, D_GS WHERE ODS_WZ_MKPF.MBLNR = ODS_WZ_MSEG.MBLNR AND ODS_WZ_MKPF.MJAHR = ODS_WZ_MSEG.MJAHR AND ODS_WZ_MKPF.CPUDT is not null AND ODS_WZ_MSEG.WERKS=D_GS.GS_ID AND ODS_WZ_MKPF.BLART='WA' AND D_GS.SJ_GS_ID !='DQ00' AND ODS_WZ_MSEG.WERKS!='0010' AND ODS_WZ_MKPF.TCODE2 !='MBST'
該語句引起我注意的是,Elapsed Time:99s ,CPU Time:43s ,執行次數:1
該語句一次執行時間為99秒,CPU時間為43秒,IO上花費54秒。第一反應該語句有可能做全表掃描。檢視執行計劃,SQL語句中涉及到的3張表都是做全表掃描,執行計劃如下:

1 Plan hash value: 226315550
2 
3 -------------------------------------------------------------------------------------------
4 | Id  | Operation           | Name        | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
5 -------------------------------------------------------------------------------------------
6 |   0 | SELECT STATEMENT    |             |  2177K|   199M|       | 72381   (2)| 00:14:29 |
7 |*  1 |  HASH JOIN          |             |  2177K|   199M|       | 72381   (2)| 00:14:29 |
8 |*  2 |   TABLE ACCESS FULL | D_GS        |   125 |  1250 |       |     3   (0)| 00:00:01 |
9 |*  3 |   HASH JOIN         |             |  2317K|   190M|   145M| 72360   (2)| 00:14:29 |
10 |*  4 |    TABLE ACCESS FULL| ODS_WZ_MKPF |  2317K|   119M|       | 17676   (2)| 00:03:33 |
11 |*  5 |    TABLE ACCESS FULL| ODS_WZ_MSEG |  5113K|   156M|       | 36703   (2)| 00:07:21 |
12 -------------------------------------------------------------------------------------------
13 
14 Predicate Information (identified by operation id):
15 ---------------------------------------------------
16 
17    1 - access("ODS_WZ_MSEG"."WERKS"="D_GS"."GS_ID")
18    2 - filter("D_GS"."SJ_GS_ID"<>'DQ00' AND "D_GS"."GS_ID"<>'0010')
19    3 - access("ODS_WZ_MKPF"."MBLNR"="ODS_WZ_MSEG"."MBLNR" AND
20               "ODS_WZ_MKPF"."MJAHR"="ODS_WZ_MSEG"."MJAHR")
21    4 - filter("ODS_WZ_MKPF"."BLART"='WA' AND "ODS_WZ_MKPF"."TCODE2"<>'MBST' AND
22               "ODS_WZ_MKPF"."CPUDT" IS NOT NULL)
23    5 - filter("ODS_WZ_MSEG"."WERKS"<>'0010')

,在檢視三張表在有效欄位上都建立的索引,但是在該語句中3張表的選擇率低,全面掃描優於索引掃描;ODS_WZ_MSEG表返回的記錄總大小為156M,但是該表段佔用空間為1.19G,該表高水位線下可能存在大量的空資料塊,ODS_WZ_MKPF表返回的總記錄大小為51M,該表段佔用空間為611M,全面掃描了大量的空資料快,建議使用者重建這兩張表,消除高水位線下面的大量空資料塊,減少掃描空資料塊消耗的CPU資源和IO等待並節省空間。

 
 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/27571661/viewspace-751945/,如需轉載,請註明出處,否則將追究法律責任。

相關文章