【恩墨學院】Oracle Redo的產生場景及最佳化

恩墨學院發表於2018-01-22

【恩墨學院】Oracle Redo的產生場景及最佳化

Oracle Redo是以條目(Redo record)的形式記錄資料庫的所有更改操作。這些更改包括資料庫物理檔案的更改,資料庫執行狀況更改,後臺程式的寫操作,DML事務操作,資料字典DDL操作,資料庫內部遞迴呼叫等。其中,最主要的原因是DML事務的操作。


本文將分析Redo對於資料庫DML操作的記錄資訊,並提出透過減少Redo條目達到最佳化Redo,提高資料庫效能的方案。


DML事務相關的資料庫更改有哪些?


1.  資料塊更改;

2.  回滾段資料塊映象更新;

3.  資料庫內部資訊更新(資料字典表更新)。


我們可以透過日誌挖掘獲取到資料庫更改的相關資訊,如下:

 OCM 培訓課程



可以看到,Redo中記錄了DML事物的資料塊更改、回滾段更新等資訊。


如何來減少Redo的產生,從而達到最佳化Redo的目的

1.  減少索引鍵更新操作;

2.  大表(鍵)更新操作;

3.  使用Direct Load載入資料;

4.  使用Nologging進行特定操作;

5.  使用臨時表(Temporary Table);

6.  使用外部表(External Table);

7.  批次化處理DML業務程式;

8.  減少事務Commit次數,採用組提交的方式;

9.  減少Select For Update顯示鎖定,可以明顯減少Redo產生;

10.減少表記錄的數量規模(利用分割槽路由架構分割槽裁剪特性),例如使用分割槽、分表、分庫等策略;

11.減少不必要的DML操作可以減少Redo產生,例如改寫、整合SQL程式,最佳化業務邏輯。


透過示例驗證最佳化的可行性


採用組提交減少Redo的產生:


不採用組提交插入資料:


OCM 培訓課程

OCM 培訓課程

採用組提交(提交一次)插入資料:


OCM 培訓課程

OCM 培訓課程

從上述資料可以看出:


不採用組提交產生Redo :9268980;

採用組提交產生Redo: 5241596;

組提交大大減少了Redo的產生:4027384(9268980-5241596)。


採用臨時表可以減少Redo產生:


採用普通表插入資料:


OCM 培訓課程

採用全域性臨時表插入資料:


OCM 培訓課程


從上述資料可以看出:


普通表產生Redo:5479300;

全域性臨時表產生Redo:1607268;

全域性臨時表大大減少了Redo產生:3872032(5479300-1607268)。


論證結論


可以看到,採用組提交和使用臨時表都能有效的減少Redo的產生,從而提升了資料庫效能。有興趣的讀者可以嘗試採用其餘措施進行擴充套件驗證。



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

相關文章