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

bisal發表於2013-10-08

'db file parallel read'

        當Oracle從多個資料檔案並行讀到記憶體(PGA或Buffer Cache)的非連續緩衝時,可以看到這種等待事件。在恢復操作或為了優化而預處理緩衝(代替執行多個單塊讀)時也會有這種等待事件。

        如果這種等待事件的事件佔據大部分,可以按照“db file sequential read”的處理方法。


Direct Path Reads and Writes

直接路徑讀與寫


'direct path read'

Document 50415.1WAITEVENT: "direct path read" Reference Note


'direct path write'

Document 50416.1 WAITEVENT: "direct path write" Reference Note


'direct path read (lob)'

'direct path write (lob)'


        當資料庫程式在磁碟與程式PGA記憶體之間執行一些特殊型別的多塊IO操作時,會出現這種等待事件,這種操作會繞過Buffer Cache。可以同步或非同步兩種方式執行這樣的IO操作。

       使用這種方式的一些例子:

1. 當記憶體排序區滿了,使用臨時表空間排序時,對IO的排序操作。

2. 並行執行(查詢和DML)。

3. 預讀操作(buffer預處理)。

4. 直接讀取操作。

5. 對LOB段的IO操作(LOB段不會快取到Buffer Cache)。

        用這種方式中等待的時間都會被記錄(不會衡量用於執行IO操作的時間),但不能用Statspack的“Top 5 Wait/Timed Events”節中列表的相對位置來評估他們的真實影響。

        調優的綱領:

1. 建議使用非同步IO。

2. 在Oracle 8i,通過設定DB_FILE_DIRECT_IO_COUNT例項引數最小化IO請求數量,DB_BLOCK_SIZE x DB_FILE_DIRECT_IO_COUNT = 系統的max_io_size。

        在Oracle 8i中,預設值是64個塊。

        (在Oracle 9i,他被_DB_FILE_DIRECT_IO_COUNT引數取代,這個引數控制以位元組(不是塊)為單位的直接IO容量)。預設值是1Mb,但是如果系統的max_io_size更小,那預設值也會被縮小。

        可參考:Document 47324.1 Init.ora Parameter "DB_FILE_DIRECT_IO_COUNT" Reference Note。

3. 調整記憶體排序區,以使磁碟排序的磁碟IO最小化。

        在9i之前,使用自動SQL執行記憶體管理。(Document 147806.1 Automated SQL Execution Memory Management)

        在8i,手動調整不同的排序區。(Document 109907.1 How to Determine an Optimal SORT_AREA_SIZE)

4. 對於LOB段,可以儲存到作業系統的檔案系統中。

        Buffer Cache能夠提供一些記憶體緩衝。

5. 通過查詢V$SESSION_EVENT(等待事件)或V$SESSTAT(統計資料),明確執行直接IO操作的session。

 'physical reads direct', 'physical reads direct (lob)',

 'physical writes direct' & 'physical writes direct (lob)'

對這些SQL語句調優。

6. 根據V$FILESTAT或Statspack的“File IO Statistics”節,明確哪些資料檔案是磁碟儲存的瓶頸,將他們移到其他磁碟。


(未完待續)

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

相關文章