High Waits on 'Db File Sequential Read'

bisal發表於2013-10-19

最近某些系統AWR的top 5中“Db File Sequential Read”佔據的時間百分比非常大,通常這種等待事件是一種正常的。但當前系統效能是有些問題的,併發量大,有些緩慢,因此需要判斷這種等待事件是否能夠減少。MOS有幾篇關於這種等待事件的介紹,這是其中一篇。


High Waits on 'Db File Sequential Read' Due to Table Lookup Following Index Access (文件 ID 875472.1)

即使執行計劃已經是最優的了,但一次查詢仍能夠等待“db file sequential read'”這種事件很長的時間。通常是因為索引掃描的結果集非常大。例如:

SELECT D
FROM BIG_TABLE
WHERE A = 1253
AND B in ('CA', 'CO')
AND C > 210 ;

Rows    Row Source Operation
------- ---------------------------------------------------
 215431 TABLE ACCESS BY INDEX ROWID BIG_TABLE (cr=880191 pr=430780 pw=0 time=2293667056 us) <<<
3582275  INDEX RANGE SCAN BIG_TABLE_IDX (cr=664748 pr=218595 pw=0 time=352506821 us)

Elapsed times include waiting on following events:
  Event waited on                             Times   Max. Wait  Total Waited
  ----------------------------------------   Waited  ----------  ------------
  SQL*Net message to client                   14363        0.00          0.02
  db file sequential read                    461688        1.15       2254.55 <<<
  SQL*Net message from client                 14363        0.01          9.77
  SQL*Net break/reset to client                   1        0.00          0.00
...

在大多數這樣的例子中,執行查詢語句在“TABLE ACCESS BY INDEX ROWID”上的等待要比INDEX SCAN上需要更多的。這是因為隨機訪問錶行的代價要比索引掃描更大。


為此,可以有以下幾種方法除錯:

1. 檢查是否有更好的索引或執行計劃。可能需要重新設計索引。

2. 嘗試全表掃描。全表掃描通常比索引掃描要快,儘管CBO成本比索引掃描的成本高。

SELECT /*+ FULL(BIG_TABLE) */  D 
FROM BIG_TABLE 
WHERE A = 1253 
AND B in ('CA', 'CO') 
AND C > 210 ;

3. 如果僅僅有很少的列出現在SELECT和WHERE子句中,可以考慮為查詢建立一個複合索引避免回表。

例如:

CREATE INDEX ON BIG_TABLE (A, B, C, D);

注意:僅針對SELECT語句有效。如果是UPDATE語句,這種做法可能沒用。

4. 將表移動到更大block塊大小的表空間。更大的block塊會有更多的行,所以對減少block塊IO會有幫助。重新組織表也會有幫助,因為這樣做可以讓索引有一個更小的clustering聚類因子。

5. 可以考慮增加buffer cache的大小,以至於可以快取更多的塊大小。如果表是頻繁訪問的,使用keep buffer池也是一個不錯的選擇。

6. 考慮使用IOT(索引組織表)。IOT可能減少IO,原因就是他會將資料儲存於一個B樹索引結構。例如,如果A列是表BIG_TABLE的主鍵,可以按照如下方法建立IOT:

create table BIG_TABLE (A number primary key, B char(2), C number, D varchar2(10)) organization index;

7. 如果伺服器有足夠的空閒資源(CPU,記憶體),考慮使用並行執行。這種方式不會減少IO,但是有助於降低執行時間。

8. 較差的磁碟IO也可能是一個原因。可以提高表所在磁碟裝置的IO。這可能需要系統管理員的協助。

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

相關文章