Oracle性能優(yōu)化之Rollback Segment優(yōu)化
1、概念
Transaction以輪循的方式使用rollback segment里的extent,當(dāng)前所在的extent滿時就移動到下一個extent。可能有多個transaction同時向同一個extent寫數(shù)據(jù),但一個rollback segment block中只能保存一個transaction的數(shù)據(jù)。
Oracle 在每個Rollback segment header中保存了一個transaction table,包括了每個rollback segment中包含的事務(wù)信息,rollback segment header的活動控制了向rollbak segment寫入被修改的數(shù)據(jù)。rollback segment header是經(jīng)常被修改的數(shù)據(jù)庫塊,因此它應(yīng)該被長時間留在buffer cache中,為了避免在transaction table產(chǎn)生競爭導(dǎo)致性能下降,應(yīng)有多個rollback segment或應(yīng)盡量使用oracle server 自動管理的rollback segment。
2、診斷rollback segment header的競爭
如果rollback segment 由手工管理,下列措施診斷rollback segment header的競爭
SELECT class,count FROM v$waitstat WHERE class LIKE '%undo%' ;
SELECT Sum(Value) sum FROM v$sysstat WHERE NAME IN ('db block gets','consistent gets');
任何類型的等待次數(shù)(count)與總請求數(shù)(sum)的比率,不能超過1%?;騭elect sum(waits)*100/sum(gets) "Ratio", sum(waits) "Waits", sum(gets) "Gets" from v$rollstat;
waits的匯總數(shù)與gets的匯總數(shù)的比率應(yīng)低于1%,如果超過1%,應(yīng)創(chuàng)建更多的rollback segment。
下列字段數(shù)值如果大于0,則表明在rollback segment header上存在競爭:
A、v$rollstat 中的waits
B、v$waitstat中的undo header行
C、v$system_event中的undo segment tx slot事件
3、消耗更少的rollback segment
1)如果是刪除表里所有的數(shù)據(jù),盡可能使用trauncate而不是delete。
2)在應(yīng)用中允許用戶有規(guī)律的提交,盡可能不用長事務(wù)。
3)• Import– Set COMMIT = Y– Size the set of rows with BUFFER• Export: Set CONSISTENT=N• SQL*Loader: Set the COMMIT intervals with ROWS
4、小回滾段可能出現(xiàn)的問題
A、事務(wù)由于缺少回滾空間失敗
B、由于下列原因?qū)е碌摹癝napshot too old”問題:
Block里的事務(wù)列表被刷新,block里的SCN比列表Interested Transaction List(ITL)里起始事務(wù)的SCN更新;
Rollback segment header里的Transaction slot被重用;
回滾數(shù)據(jù)已經(jīng)被重寫;
5、9i的自動回滾管理
Undo_managment指定了回滾空間的管理方式:Auto:自動管理;Manual:手工管理回滾段。
Undo_retention指定了回滾數(shù)據(jù)的保留期限;
Undo_tablespace指定了被使用的回滾表空間;
Oracle自動管理的表空間可以在常見數(shù)據(jù)庫的時候創(chuàng)建,也可以單獨建立。回滾表空間可以相互轉(zhuǎn)換(switch),但在某一時刻只能有一個回滾表空間處于活動狀態(tài)?;貪L表空間處于非活動狀態(tài)時可以刪除,如果有對處于被刪除回滾表空間里的已提交事務(wù)的查詢時,oracle會返回一個錯誤。
估計undo tablespace大小的公式:
Undo space = (undo_retention * (undo blocks per second * db_block_size)) + db_block_size;
可以使用下列的sql設(shè)定undo_retention和undo tablespace:
select (rd*(ups*overhead)+overhead) "bytes" from (select value rd from v$parameter where name ='undo_retention'),(select (sum(undoblks)/sum(((end_time-begin_time)*10800))) ups from v$undostat),(select value overhead from v$parameter where name='db_block_size');
其中:
Rd:undo_retention設(shè)置的時間;
Ups:undo blocks per second;
Overhead:rollback segment header;
【編輯推薦】