'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”節,明確哪些數據文件是磁盤存儲的瓶頸,將他們移到其他磁盤。