在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.oracle
2. 大量的Hash Join操做,利用temp表空間保存hash區。函數
3. SQL語句的並行處理性能
4. 大表的全表掃描,在中,全表掃描的算法有新的變化,根據表的大小、高速緩存的大小等信息,決定是否繞過SGA直接從磁盤讀Oracle11g取數據。而10g則是所有經過高速緩存讀取數據,稱爲table scan(large)。11g認爲大表全表時使用直接路徑讀,可能比10g中的數據文件散列讀(db file scattered reads)速度更快,使用的latch也更少。blog
大量的direct path read等待時間最多是一個應用程序問題。 direct path read事件由SQL語句驅動,這些SQL語句執行來自臨時的或常規的表空間的直接讀取操做。 當輸入的內容大於PGA中的工做區域時,帶有須要排序的函數的SQL語句將排序結果寫入到臨時表空間中,臨時表空間中的排序順序串隨後被合併,用於提供最終的結果。讀取排序結果時,Oracle會話在direct path read等待事件上等待。DB_FILE_DIRECT_IO_COUNT初始化參數可能影響direct path read的性能。
排序