3.4 redo優化
從前面的内容可以知道,oracle redo的産生主要是由dml事務引起的,與dml事務相關的資料庫更改主要包含:
資料塊更改;
復原段資料塊鏡像更新;
資料庫内部資訊更新(資料字典表更新)。
可以通過日志挖掘擷取資料庫更改的相關資訊,如下:
可以看到,redo中記錄了dml事物的資料塊更改、復原段更新等資訊。是以,可以考慮采取以下措施來減少redo的産生,進而達到優化redo的目的:
減少索引鍵更新操作;
減少大表(鍵)更新操作;
使用direct load加載資料;
使用nologging進行特定操作;
使用臨時表(temporary table);;
使用外部表(external table);
批量化處理dml業務程式;
減少事務commit次數,采用組送出的方式;
減少select for update顯示鎖定,可以明顯減少redo産生;
減少表記錄的數量規模(利用分區路由架構分區裁剪特性),例如使用分區、分表、分庫等政策;
減少不必要的dml操作可以減少redo産生,例如改寫、整合sql程式,優化業務邏輯。
可以通過下面的示例驗證優化的可行性。
(1)采用組送出減少redo的産生
不采用組送出插入資料:
采用組送出(送出一次)插入資料:
從上述資料可以看出:
不采用組送出産生redo:9268980;
采用組送出産生redo:5241596;
組送出大大減少了redo的産生:4027384(9268980-5241596)。
(2)采用臨時表可以減少redo産生
采用普通表插入資料:
采用全局臨時表插入資料:
普通表産生redo:5479300;
全局臨時表産生redo:1607268;
全局臨時表大大減少了redo産生:3872032(5479300-1607268)。
可以看到,采用組送出和使用臨時表都能有效減少redo的産生,進而提升資料庫的性能。有興趣的讀者可以嘗試采用其他措施進行擴充驗證。