共計 2294 個字符,預計需要花費 6 分鐘才能閱讀完成。
這篇文章主要介紹 Oracle event 之 db file read 怎么用,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
db file sequential read (single block read into one SGA buffer)
db file scattered read (multiblock read into many discontinuous SGA buffers)
direct read (single or multiblock read into the PGA, bypassing the SGA)
最為常見的是執行計劃中包含了 INDEX FULL SCAN/UNIQUE SCAN, 此時出現”db file sequential read”等待是預料之中的,一般不需要我們去特別關注
2. 當執行計劃包含了 INDEX RANGE SCAN-(“TABLE ACCESS BY INDEX ROWID”/”DELETE”/”UPDATE”),服務進程將按照”訪問索引 - 找到 rowid- 訪問 rowid 指定的表數據塊并執行必要的操作”順序訪問 index 和 table,每次物理 讀取都會進入”db file sequential read”等待,且每次讀取的都是一個數據塊;這種情況下 clustering_factor 將發揮其作用,需要我們特別去關注,本例中提及的解決方法對 這種情景也有效
3.Extent boundary, 假設一個 Extent 區間中有 33 個數據塊,而一次”db file scattered read”多塊讀所讀取的塊數為 8,那么在讀取這個區間時經過 4 次多塊讀取后,還剩下一個數據塊,但是請記住多塊讀 scattered read 是不能跨越一個區間的(span an extent),此時就會單塊讀取并出現”db file sequential read”。這是一種正常現象,一般不需要額外關注
4. 假設某個區間內有 8 個數據塊,它們可以是塊 a,b,c,d,e,f,g,h,恰好當前系統中除了 d 塊外的其他數據塊都已經被緩存在 buffer cache 中了,而這時候恰好要訪問這個區間中的數據,那么此時就會單塊讀取 d 這個數據塊,并出現”db file sequential read”等待。注意這種情況不僅于表,也可能發生在索引上。這是一種正常現象,一般不需要額外關注
5.chained/migrated rows 即鏈式或遷移行,這里我們不介紹鏈式行的形成原因,chained/migrated rows 會造成服務進程在 fetch 一行記錄時需要額外地單塊讀取,從而出現”db file sequential read”。這種現象需要我們特別去關注,因為大量的鏈式 / 遷移行將導致如 FULL SCAN 等操作極度惡化(以往的經驗是一張本來全表掃描只需要 30 分鐘的表,在出現大量鏈式行后,全表掃描需要數個小時),同時也會對其他操作造成不那么 明顯的性能影響。可以通過監控 v$sysstat 視圖中的”table fetch continued row”操作統計來了解系統中鏈式 / 遷移行訪問的情況,還可以通過 DBA_TBALES 視圖中的 CHAIN_CNT 來了解表上的鏈式 / 遷移行情況,當然這 要求定期收集表上的統計信息;如果沒有定期收集的習慣,那么可以配合 @?/rdbms/admin/utlchain 腳本和 analyze table list chained rows 命令來獲取必要的鏈式行信息
6. 創建 Index entry,顯然當對表上執行 INSERT 操作插入數據時,雖然在執行計劃中你看不到過多的細節,但實際上我們需要利用索引來快速驗證表上的某些約束是否 合理,還需要在索引的葉子塊中插入相關的記錄,此時也可能出現”db file sequential read”等待事件,當然這還和具體的插入的方式有關系。這是一種正常現象,一般不需要額外關注
7. 針對表上的 UPDATE/DELETE,不同于之前提到的”INDEX RANGE SCAN-UPDATE/DELETE”,如果我們使用 rowid 去更新或刪除數據時,服務進程會先訪問 rowid 指向的表塊 (注意是先訪問 table block) 上的行數據,之后會根據該行上的具體數據去訪問索引葉子塊(注意 Oracle 并不知道這些 leaf block 在哪里,所以這里同樣要如 range-scan/unique-scan 那樣去訪問 index branch block),這些訪問都將會是單塊讀取,并會出現’db file sequential read’,完成必要的讀取后才會執行更新或刪除的實際 EXEC 操作
db file sequential read 當進程需要的信息不在 SGA,要等待從磁盤讀入 SGA 中,此時進程等待此事件。一般是由 sql 或者遞歸 sql 中發出,從索引,回滾段,表(rowid 回表),控制文件,數據文件頭處讀取信息觸發. 要減少這個等待事件,要么減少它的次數,要么減少平均等待時間。通過調優 SQL 來減少邏輯讀,留意效率低的大范圍索引掃描回表(可能全表掃更好),可以減低次數。用更高響應時間的存儲,分散熱點文件,可以減輕平均等待時間。在新的存儲子系統,平均單塊讀等待時間不應超過 10ms(千分之一秒)。通過 p1 與 p2 參數與 dba_extents 視圖,我們定位到等待訪問的段,然后來分散熱點。
官檔等待事件:performance tuning guide — wait events statistics
以上是“Oracle event 之 db file read 怎么用”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注丸趣 TV 行業資訊頻道!