那些被你忽略的性能 - Oracle Redo的產生場景及優化
冷菠,資深DBA,著有《Oracle高性能自動化運維》,有近10年的數據庫運維、團隊管理以及培訓經驗。擅長數據庫備份恢複、數據庫性能診斷優化以及數據庫自動化運維等。目前致力於大數據、智能一體化、開源雲計算等領域的佳實踐探索。
Oracle Redo是以條目(Redo record)的形式記錄數據庫的所有更改操作。這些更改包括數據庫物理文件的更改,數據庫運行狀況更改,後台進程的寫操作,DML事務操作,數據字典DDL操作,數據庫內部遞歸調用等。其中,最主要的原因是DML事務的操作。
本文將分析Redo對於數據庫DML操作的記錄信息,並提出通過減少Redo條目達到優化Redo,提高數據庫性能的方案。
- 數據塊更改;
- 回滾段數據塊鏡像更新;
- 數據庫內部信息更新(數據字典表更新)。
我們可以通過日誌挖掘獲取到數據庫更改的相關信息,如下:
可以看到,Redo中記錄了DML事物的數據塊更改、回滾段更新等信息。
- 減少索引鍵更新操作;
- 大表(鍵)更新操作;
- 使用Direct Load加載數據;
- 使用Nologging進行特定操作;
- 使用臨時表(Temporary Table);
- 使用外部表(External Table);
- 批量化處理DML業務程序;
- 減少事務Commit次數,采用組提交的方式;
- 減少Select For Update顯示鎖定,可以明顯減少Redo產生;
- 減少表記錄的數量規模(利用分區路由架構分區裁剪特性),例如使用分區、分表、分庫等策略;
- 減少不必要的DML操作可以減少Redo產生,例如改寫、整合SQL程序,優化業務邏輯。
采用組提交減少Redo的產生:
不采用組提交插入數據:
采用組提交(提交一次)插入數據:
從上述數據可以看出:
- 不采用組提交產生Redo :9268980;
- 采用組提交產生Redo: 5241596;
- 組提交大大減少了Redo的產生:4027384(9268980-5241596)。
采用臨時表可以減少Redo產生:
采用普通表插入數據:
采用全局臨時表插入數據:
從上述數據可以看出:
- 普通表產生Redo:5479300;
- 全局臨時表產生Redo:1607268;
- 全局臨時表大大減少了Redo產生:3872032(5479300-1607268)。
可以看到,采用組提交和使用臨時表都能有效的減少Redo的產生,從而提升了數據庫性能。有興趣的讀者可以嚐試采用其餘措施進行擴展驗證。
原文發布時間為:2017-09-05-07
本文作者: 冷菠
本文來自雲棲社區合作夥伴“數據和雲”,了解相關信息可以關注“數據和雲”微信公眾號
最後更新:2017-09-07 13:32:27