High Waits on 'Db File Sequential Read'
最近某些系統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
注意:僅針對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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 解決db file sequential read與db file scattered read
- db file sequential read等待事件事件
- 【等待事件】db file sequential read事件
- db file sequential read 詳解
- db file sequential read及優化優化
- db file scattered read與事件db file sequential read相類似(轉)事件
- 等待事件db file sequential read、db file scattered read和direct read的區別事件
- db file sequential read事件的發生事件
- 詳解 db file sequential read 等待事件事件
- data file int write和db file sequential read個人想法
- Waiting Too Frequently for 'db file sequential read'AI
- oracle wait event之db file sequential readOracleAI
- oracle之 db file sequential read等待事件優化思想Oracle事件優化
- 何時會發生db file sequential read等待事件?事件
- db file sequential read wait event等待事件之二AI事件
- 【TUNE_ORACLE】等待事件之IO等待“db file sequential read”Oracle事件
- 【kingsql分享】何時出現生db file sequential read等待事件SQL事件
- 等待事件--db file sequential reads事件
- 同一個資料塊的db file sequential read,說明了什麼?
- control file sequential read等待事件事件
- Oracle:db file scattered readOracle
- 事件:db file scattered read事件
- oracle等待事件2構造一個DB File Sequential Read等待事件和構造一個Direct Path ReadOracle事件
- db file scattered read等待事件事件
- 【等待事件】db file scattered read事件
- I/O上的等待事件 —— control file sequential read/control file parallel write事件Parallel
- 消除11.2上的db file parallel readParallel
- 0322理解db file parallel read等待事件2Parallel事件
- 0316理解db file parallel read等待事件Parallel事件
- 非空閒的等待事件-db file scattered read事件
- DB_FILE_MULTIBLOCK_READ_COUNT的設定BloC
- tatspack之十二-db file scattered read-DB檔案分散讀取
- 非空閒等待事件之:db file scattered read(轉)事件
- Buffer busy waits/read by other sessionAISession
- 【TUNE_ORACLE】等待事件之IO等待“db file scattered read”Oracle事件
- Oracle中db_file_multiblock_read_count引數探究OracleBloC
- 關於db_file_multiblock_read_count引數的設定BloC
- oracle 10g的db_file_multiblock_read_count引數Oracle 10gBloC