Oracle性能優(yōu)化之Rollback Segment優(yōu)化
1、概念
Transaction以輪循的方式使用rollback segment里的extent,當(dāng)前所在的extent滿(mǎn)時(shí)就移動(dòng)到下一個(gè)extent??赡苡卸鄠€(gè)transaction同時(shí)向同一個(gè)extent寫(xiě)數(shù)據(jù),但一個(gè)rollback segment block中只能保存一個(gè)transaction的數(shù)據(jù)。
Oracle 在每個(gè)Rollback segment header中保存了一個(gè)transaction table,包括了每個(gè)rollback segment中包含的事務(wù)信息,rollback segment header的活動(dòng)控制了向rollbak segment寫(xiě)入被修改的數(shù)據(jù)。rollback segment header是經(jīng)常被修改的數(shù)據(jù)庫(kù)塊,因此它應(yīng)該被長(zhǎng)時(shí)間留在buffer cache中,為了避免在transaction table產(chǎn)生競(jìng)爭(zhēng)導(dǎo)致性能下降,應(yīng)有多個(gè)rollback segment或應(yīng)盡量使用oracle server 自動(dòng)管理的rollback segment。
2、診斷rollback segment header的競(jìng)爭(zhēng)
如果rollback segment 由手工管理,下列措施診斷rollback segment header的競(jìng)爭(zhēng)
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');
任何類(lèi)型的等待次數(shù)(count)與總請(qǐng)求數(shù)(sum)的比率,不能超過(guò)1%?;騭elect sum(waits)*100/sum(gets) "Ratio", sum(waits) "Waits", sum(gets) "Gets" from v$rollstat;
waits的匯總數(shù)與gets的匯總數(shù)的比率應(yīng)低于1%,如果超過(guò)1%,應(yīng)創(chuàng)建更多的rollback segment。
下列字段數(shù)值如果大于0,則表明在rollback segment header上存在競(jìng)爭(zhēng):
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)用中允許用戶(hù)有規(guī)律的提交,盡可能不用長(zhǎng)事務(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)的問(wèn)題
A、事務(wù)由于缺少回滾空間失敗
B、由于下列原因?qū)е碌摹癝napshot too old”問(wèn)題:
Block里的事務(wù)列表被刷新,block里的SCN比列表Interested Transaction List(ITL)里起始事務(wù)的SCN更新;
Rollback segment header里的Transaction slot被重用;
回滾數(shù)據(jù)已經(jīng)被重寫(xiě);
5、9i的自動(dòng)回滾管理
Undo_managment指定了回滾空間的管理方式:Auto:自動(dòng)管理;Manual:手工管理回滾段。
Undo_retention指定了回滾數(shù)據(jù)的保留期限;
Undo_tablespace指定了被使用的回滾表空間;
Oracle自動(dòng)管理的表空間可以在常見(jiàn)數(shù)據(jù)庫(kù)的時(shí)候創(chuàng)建,也可以單獨(dú)建立?;貪L表空間可以相互轉(zhuǎn)換(switch),但在某一時(shí)刻只能有一個(gè)回滾表空間處于活動(dòng)狀態(tài)?;貪L表空間處于非活動(dòng)狀態(tài)時(shí)可以刪除,如果有對(duì)處于被刪除回滾表空間里的已提交事務(wù)的查詢(xún)時(shí),oracle會(huì)返回一個(gè)錯(cuò)誤。
估計(jì)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è)置的時(shí)間;
Ups:undo blocks per second;
Overhead:rollback segment header;
【編輯推薦】