我們經(jīng)常會見到db file scattered read等待事件,在生產(chǎn)環(huán)境中,這個等待事件可能更為常見。這個事件表明用戶進程正在讀數(shù)據(jù)到Buffer Cache中,等待直到I/O調(diào)用返回。db file scattered read發(fā)出離散讀,將存儲上連接的數(shù)據(jù)塊離散的讀入到多個不連續(xù)的內(nèi)存位置。Scattered Read通常是多塊讀,在Full Table Scan或Fast Full Scan等訪問方式下使用。
Scattered Read代表Full Scan,當執(zhí)行Full Scan讀取數(shù)據(jù)到Buffer Cache時,通常連續(xù)的數(shù)據(jù)在內(nèi)存中的存儲位置并不連續(xù),所以這個等待被命名為Scattered Read(離散讀)。每次多塊讀讀取的數(shù)據(jù)塊數(shù)量受初始化參數(shù)DB_FILE_MULTIBLOCK_READ_COUNT限制。下圖簡要說明了Scattered Read的數(shù)據(jù)讀取方式。
從v$event_name視圖可以看到,該等待有3個參數(shù),分別代表文件號、起始數(shù)據(jù)塊號、數(shù)據(jù)塊的數(shù)量:
sys@CCDB> select event#,name,parameter1,parameter2,parameter3
2 from v$event_name
3 where name = 'db file scattered read';
EVENT# NAME PARAMETER1 PARAMETER2 PARAMETER3
---------- ------------------------------ ------------ ------------ ------------
132 db file scattered read file# block# blocks
數(shù)據(jù)文件號、起始數(shù)據(jù)號加上數(shù)據(jù)塊的數(shù)量,通過這些信息可以知道Oracle Session正在等待的對象文件等信息。該等待可能和全表掃描(Full Table Scan)或者快速全索引掃描(Index Fast Full Scan)的連續(xù)讀取相關(guān),根據(jù)經(jīng)驗,通常大量的db file scattered read等待可能意味著應(yīng)用問題或者索引缺失。
在實際環(huán)境的診斷過程中,可以通過v$session_wait視圖發(fā)現(xiàn)session的等待,再結(jié)合其他視圖找到存在問題的SQL等根本原因,從而從根本上解決問題。
當這個等待事件比較顯著時,用戶也可以結(jié)合v$session_longops動態(tài)性能視圖來進行診斷,該視圖中記錄了長時間(運行時間超過6秒的)運行的事務(wù),可能很多是全表掃描操作(不管怎樣,這部分信息都是值得我們注意的)。
從Oracle 9i開始,Oracle新增加了一個視圖v$sql_plan用于記錄當前系統(tǒng)Library Cache中SQL語句的執(zhí)行計劃,可以通過這個視圖找到存在問題的SQL語句。
可以過程v$sql_plan和v$sqltext聯(lián)合,獲得這些查詢的SQL語句,查找全表掃描的SQL語句可以參考如下語句:
select sql_text
from v$sqltext t,v$sql_plan p
where t.hash_value = p.hash_value
and p.operation = 'TABLE ACCESS'
and p.options = 'FULL'
order by p.hash_value,t.piece;
查找Fast Full Index掃描的SQL語句可以參考如下語句:
select sql_text
from v$sqltext t, v$sql_plan p
where t.hash_value = p.hash_value
and p.operation = 'INDEX'
and p.options = 'FULL SCAN'
order by p.hash_value, t.piece;
這些信息對于發(fā)現(xiàn)數(shù)據(jù)庫問題,優(yōu)化數(shù)據(jù)庫性能具有極強的指導(dǎo)意義。
在Oracle 10g中,Oracle對等待事件進行了分類,db file scattered read事件被歸入User I/O一類:
sys@CCDB> select name,parameter1 p1,parameter2 p2,parameter3 p3,
2 wait_class_id,wait_class#,wait_class
3 from v$event_name
4 where name = 'db file scattered read';
NAME P1 P2 P3 WAIT_CLASS_ID WAIT_CLASS# WAIT_CLASS
------------------------- ---------- ---------- ---------- ------------- ----------- ------------
db file scattered read file# block# blocks 1740759767 8 User I/O
完成對等待事件的分類之后,Oracle 10g的ADDM可以很容易地通過故障分析定位到問題所在,幫助用戶快速發(fā)現(xiàn)數(shù)據(jù)庫的瓶頸及瓶頸的根源,這就是Oracle的ADDM專家系統(tǒng)的設(shè)計思想。
通過下圖可以直觀清晰地看到這個等待模型和ADDM結(jié)合實現(xiàn)的Oracle專家診斷系統(tǒng)。
- The End -