閱讀845 返回首頁    go 阿裏雲 go 技術社區[雲棲]


那些被你忽略的性能 - Oracle Redo的產生場景及優化


image


冷菠,資深DBA,著有《Oracle高性能自動化運維》,有近10年的數據庫運維、團隊管理以及培訓經驗。擅長數據庫備份恢複、數據庫性能診斷優化以及數據庫自動化運維等。目前致力於大數據、智能一體化、開源雲計算等領域的佳實踐探索。

Oracle Redo是以條目(Redo record)的形式記錄數據庫的所有更改操作。這些更改包括數據庫物理文件的更改,數據庫運行狀況更改,後台進程的寫操作,DML事務操作,數據字典DDL操作,數據庫內部遞歸調用等。其中,最主要的原因是DML事務的操作。

本文將分析Redo對於數據庫DML操作的記錄信息,並提出通過減少Redo條目達到優化Redo,提高數據庫性能的方案。




  1. 數據塊更改;
  2. 回滾段數據塊鏡像更新;
  3. 數據庫內部信息更新(數據字典表更新)。

我們可以通過日誌挖掘獲取到數據庫更改的相關信息,如下:


image


可以看到,Redo中記錄了DML事物的數據塊更改、回滾段更新等信息。




  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的產生:

不采用組提交插入數據:


image


采用組提交(提交一次)插入數據:


image


從上述數據可以看出:

  • 不采用組提交產生Redo :9268980;
  • 采用組提交產生Redo: 5241596;
  • 組提交大大減少了Redo的產生:4027384(9268980-5241596)。

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

采用普通表插入數據:


image


采用全局臨時表插入數據:


image

從上述數據可以看出:

  • 普通表產生Redo:5479300;
  • 全局臨時表產生Redo:1607268;
  • 全局臨時表大大減少了Redo產生:3872032(5479300-1607268)。




可以看到,采用組提交和使用臨時表都能有效的減少Redo的產生,從而提升了數據庫性能。有興趣的讀者可以嚐試采用其餘措施進行擴展驗證。

原文發布時間為:2017-09-05-07
本文作者: 冷菠
本文來自雲棲社區合作夥伴“數據和雲”,了解相關信息可以關注“數據和雲”微信公眾號

最後更新:2017-09-07 13:32:27

  上一篇:go  從Oracle收購SUN的結果,分析未來企業上雲的趨勢與方案
  下一篇:go  Uber數據基礎架構現在及未來