等待事件 direct path read 與11g中的非並行直接讀

tolywang發表於2013-04-22
direct path read(User I/O 類)

這類讀取通常在以下情況被使用:
·磁碟排序IO操作(從臨時表空間中讀出排序結果);
·並行查詢從屬程式;
·預讀操作。

最為常見的是第一種情況。在DSS系統中,存在大量的direct path read是很正常的,但是在OLTP系統中,
通常顯著的直接路徑讀(direct path read)都意味著系統應用存在問題,從而導致大量的磁碟排序讀
取操作。


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

direct path read較高的可能原因有:
 
1. 大量的磁碟排序操作,order by, group by, union, distinct, rollup, 無法在PGA中
   完成排序,需要利用temp表空間進行排序。當從臨時表空間中讀取排序結果到PGA時,
   會產生direct path read.
 
2. 大量的Hash Join操作,利用temp表空間儲存hash區。
 
3. SQL語句的並行處理 (常規表空間的直接讀取,所謂直接讀取即從磁碟直接讀到PGA)
 
4. 大表的全表掃描,在11g中,全表掃描的演算法有新的變化,根據表的大小、快取記憶體的大小
   等資訊,決定是否繞過SGA直接從磁碟讀取資料。而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 = auto  預設值
  _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/35489/viewspace-759050/,如需轉載,請註明出處,否則將追究法律責任。

相關文章