Oracle中的direct path read事件(轉)

paulyibinyi發表於2016-01-05
在11g中,全表掃描可能使用direct path read方式,繞過buffer cache,這樣的全表掃描就是物理讀了。 在10g中,都是透過gc buffer來讀的,所以不存在direct path read的問題。

  direct path read較高的可能原因有:

  1. 大量的磁碟排序操作,order by, group by, union, distinct, rollup, 無法在PGA中完成排序,需要利用temp表空間進行排序。 當從臨時表空間中讀取排序結果時,會產生direct path read.

  2. 大量的Hash Join操作,利用temp表空間儲存hash區。

  3. SQL語句的並行處理

  4. 大表的全表掃描,在中,全表掃描的演算法有新的變化,根據表的大小、快取記憶體的大小等資訊,決定是否繞過SGA直接從磁碟讀Oracle11g取資料。而10g則是全部透過快取記憶體讀取資料,稱為table scan(large)。11g認為大表全表時使用直接路徑讀,可能比10g中的資料檔案雜湊讀(db file scattered reads)速度更快,使用的latch也更少。

  大量的direct path read等待時間最可能是一個應用程式問題。

  direct path read事件由SQL語句驅動,這些SQL語句執行來自臨時的或常規的表空間的直接讀取操作。
 
  當輸入的內容大於PGA中的工作區域時,帶有需要排序的函式的SQL語句將排序結果寫入到臨時表空間中,
 
  臨時表空間中的排序順序串隨後被合併,用於提供最終的結果。讀取排序結果時,
 
  Oracle會話在direct path read等待事件上等待。
 
  DB_FILE_DIRECT_IO_COUNT初始化引數可能影響direct path read的效能。

  一個隱含引數:

  _serial_direct_read = false 禁用direct path read

  _serial_direct_read = true 啟用direct path read

  alter sytem set "_serial_direct_read"=never scope=both sid='*';

    可以顯著減少direct path read

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

相關文章