與IO相關的等待事件troubleshooting-系列5

bisal發表於2013-10-07

'db file scattered read'

        這是另一種常見的等待事件。他產生於Oracle從磁碟讀取多個塊到Buffer Cache中非連續("scattered")快取的時候。這種讀一次最大值是DB_FILE_MULTIBLOCK_READ_COUNT。這種典型場景像全表掃描(Full Table Scans)和全索引快速掃描(Fast Full Index
scans)。
        如果這個等待事件佔據大部分等待時間,下面的方法可以用到:
1. 找到執行全表掃描或全索引快速掃描的SQL語句,進行調優以確保這些掃描是必須的,而不是非最優執行計劃導致的。
        從Oracle 9i開始,新的V$SQL_PLAN檢視可以幫上忙:(忽略在這些查詢結果中的資料字典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;
對於全索引快速掃描:
elect 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;
        在Oracle 8i,對於這種等待事件,通過查詢V$SESSION_EVENT可以找到執行多塊讀的session,然後使用SQL Tracing跟蹤這些session的SQL。另外,物理讀Top前幾位的SQL語句也能用來研究,判斷他們的執行計劃是否包含了全表掃描或全索引快速掃描。

2. 在這樣最優執行計劃就是多塊讀掃描的場景,可以通過調整多塊IO的容量進行調優,需要修改例項引數DB_FILE_MULTIBLOCK_READ_COUNT,計算:DB_BLOCK_SIZE x DB_FILE_MULTIBLOCK_READ_COUNT = 系統的max_io_size。
(可參考:
Document 30712.1 Init.ora Parameter "DB_FILE_MULTIBLOCK_READ_COUNT" Reference
Document 1037322.6 WHAT IS THE DB_FILE_MULTIBLOCK_READ_COUNT PARAMETER?)
        正如之前所說的,從Oracle 10g R2開始,DB_FILE_MULTIBLOCK_READ_COUNT初始化引數現在可以自動調優,當未顯示設定時可以使用一個預設值。這個預設值和可以高效執行的最大IO容量相關。引數值依賴於平臺,對於大多數平臺是1MB。因為引數是以塊表示的,所以也可以設定為一個和可以高效執行的最大IO容量相當的值(被標準塊容量切分)。

3.  因為使用全表掃描和全索引快速掃描的塊會放到Buffer Cache取代鏈的最少最近使用端,有時使用多Buffer Pools,將這些段放到KEEP池中都會有所幫助。(可參考:Document 76374.1 Multiple Buffer Pools)

4. 使用分割槽能夠降低作為分割槽剪裁掃描資料的數量,限制段分割槽的掃描子集。

5. 最後,可以考慮最長訪問的段包含的資料數量(通過將舊的、不需要的資料移出資料庫),或將這些段移動到新的、更快的磁碟,以降低IO的響應時間。

(未完待續)

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

相關文章