天天看點

db file sequential read等待事件

最近某個應用的AWR中總顯示“db file sequential read“等待事件位于top 5之首,下面檢索下MOS關于這個等待事件的說明。

等待事件: "db file sequential read" Reference Note (文檔 ID 34559.1)

        這種等待事件是一種IO讀請求相關的等待。與”db file scattered read“不同,因為”sequential read“是将資料讀到連續的記憶體(注意:這裡指的是讀到相連的記憶體,不是說讀取的是連續的資料塊。同時一次”scattered read“可以讀多個塊,将他們分散到SGA的不同buffer)。這一事件通常顯示與單個資料塊相關的讀取操作(如索引讀取)。如果這個等待事件比較顯著,可能表示在多表連接配接中,表的連接配接順序存在問題,可能沒有正确的使用驅動表;或者可能說明不加選擇地進行索引。

        一次”sequential read“通常是單塊讀,盡管可能看到對于多個塊的”sequential read“(見後面的描述)。這種等待也可能在資料檔案頭讀取中看到(P2=1表明是讀取檔案頭)。

獨立的等待:

參數:

    P1 = file#

    P2 = block#

    P3 = blocks

file#   指的是Oracle正在讀取的檔案file#。Oracle8/9中file#是絕對檔案号。

block#  指的是Oracle正在讀取的塊号。一次隻能讀取一個塊。

blocks  這個參數明确了Oracle正在從file#的block#開始讀取的塊數。通常是”1“,但如果P3>1,那麼這就是一次多塊讀。當從SORT(TEMPORARY)段讀取資料時,多塊的”db file sequential read“可以在更早的Oracle版本中看到。

等待時間:

IO通常是指對作業系統的一次IO請求-直到IO請求完成的等待的塊。當Oracle對作業系統的讀請求可以從作業系統檔案系統的緩存中得到時,等待時間會非常小。

系統級等待:

        IO是一種正常的活動,是以真正關心的是那些不必要的或明顯緩慢的IO活動。如果花費在IO上的時間非常大,那麼我們能夠判斷哪部分segement段,Oracle是需要從磁盤中擷取的。可以檢視ESTAT或STATSPACK報告中"Tablespace IO"和"File IO"節,可以得到一些關于哪些表空間/檔案正在用于大部分IO請求,得到IO子系統處理速度的名額。如果花費在等待讀的時間非常大,那麼找出Oracle正在讀哪些segment段是非常有幫助的。可以找到哪些檔案正在被讀。

        找出哪些session正在讀,并且通過trace跟蹤他們來看IO是否正常,也是對此類等待事件的判斷是有幫助的。下面的SQL可以找出哪些session值得跟蹤:

SELECT sid, total_waits, time_waited

FROM v$session_event

WHERE event='db file sequential read' and total_waits>0 ORDER BY 3,2;

也可以改下上面的語句:

找出高磁盤讀取的session(”DISK_READS“)

找出高實體讀的session("physical reads")

降低等待次數和時間:

        塊的讀取往往是無法避免的,是以為了降低等待時間,目标就是最小化不必要的IO。為了達到此目的,就需要良好的應用設計和有效的執行計劃。執行計劃的改變能夠對性能産生非常大的影響。系統級的微小調整通常收貨甚微。下面幾點可能有用:

(1)、查找使用未加以選擇的索引範圍(index scan)掃描的SQL。

(2)、更大的buffer cache也許有幫助-需要通過真實增加buffer cache來測試,而不是使用DB_BLOCK_LRU_EXTENDED_STATISTICS參數,(如果有可能導緻額外的系統換頁,那麼就不能增加SGA大小)。

(3)、還有一些不太明顯的問題可能影響IO,将資料進行實體聚類的程度如何。例如,假設頻繁地從一個表中擷取行資料,該表中一列是通過索引範圍(index scan)掃描的方式得到兩個值。如果這裡每個索引塊中有100行資料,那麼有兩個極端:

1. 每行資料都在不同的實體資料塊(每個索引塊包含的100行資料需要讀取100個塊)。

2. 所有資料都配置設定到極少的幾個相鄰實體資料塊(每個索引塊隻需要讀取少量的塊)。

預先排序或重組資料可以幫助解決這種極端情況。

1. 分區是否能夠用來降低需要讀取的資料塊數量。

2. 找到引起磁盤中頻繁的索引範圍(index scan)的檔案,将它緩存到作業系統檔案系統的緩存中。這樣将會允許Oracle讀請求可以從作業系統緩存中獲得,而不是從磁盤IO中獲得。