天天看點

《Oracle高性能自動化運維》一一3.4 Redo優化

本節書摘來自華章計算機《oracle高性能自動化運維》一書中的第3章,第3.4節,作者:冷菠 著,更多章節内容可以通路雲栖社群“華章計算機”公衆号檢視。

從前面的内容可以知道,oracle redo的産生主要是由dml事務引起的,與dml事務相關的資料庫更改主要包含:

資料塊更改;

復原段資料塊鏡像更新;

資料庫内部資訊更新(資料字典表更新)。

可以通過日志挖掘擷取資料庫更改的相關資訊,如下:

《Oracle高性能自動化運維》一一3.4 Redo優化
《Oracle高性能自動化運維》一一3.4 Redo優化

可以看到,redo中記錄了dml事物的資料塊更改、復原段更新等資訊。是以,可以考慮采取以下措施來減少redo的産生,進而達到優化redo的目的:

減少索引鍵更新操作;

減少大表(鍵)更新操作;

使用direct load加載資料;

使用nologging進行特定操作;

使用臨時表(temporary table);;

使用外部表(external table);

批量化處理dml業務程式;

減少事務commit次數,采用組送出的方式;

減少select for update顯示鎖定,可以明顯減少redo産生;

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

減少不必要的dml操作可以減少redo産生,例如改寫、整合sql程式,優化業務邏輯。

可以通過下面的示例驗證優化的可行性。

(1)采用組送出減少redo的産生

不采用組送出插入資料:

《Oracle高性能自動化運維》一一3.4 Redo優化
《Oracle高性能自動化運維》一一3.4 Redo優化

采用組送出(送出一次)插入資料:

《Oracle高性能自動化運維》一一3.4 Redo優化
《Oracle高性能自動化運維》一一3.4 Redo優化

從上述資料可以看出:

不采用組送出産生redo:9268980;

采用組送出産生redo:5241596;

組送出大大減少了redo的産生:4027384(9268980-5241596)。

(2)采用臨時表可以減少redo産生

采用普通表插入資料:

《Oracle高性能自動化運維》一一3.4 Redo優化

采用全局臨時表插入資料:

《Oracle高性能自動化運維》一一3.4 Redo優化

普通表産生redo:5479300;

全局臨時表産生redo:1607268;

全局臨時表大大減少了redo産生:3872032(5479300-1607268)。

可以看到,采用組送出和使用臨時表都能有效減少redo的産生,進而提升資料庫的性能。有興趣的讀者可以嘗試采用其他措施進行擴充驗證。