5

Click here to load reader

Rollback Segmentleri̇n Opti̇mi̇zasyonu

Embed Size (px)

Citation preview

Page 1: Rollback Segmentleri̇n Opti̇mi̇zasyonu

Anar Godjaevhttp://anargodjaev.wordpress.com/

ROLLBACK SEGMENTLERİN OPTİMİZASYONU

Bir sorgu bir tablo üzerindeki row ve rowlar üzerinde değişiklik yapacaksa bu değişkliğin eski hali undo segmentler üzerinde tutulur.Eğer rollback yaparsak eski değer bu rollback segmentten alınır ve yerine konulur

Page 2: Rollback Segmentleri̇n Opti̇mi̇zasyonu

Anar Godjaevhttp://anargodjaev.wordpress.com/

Rollbak segmentlerin büyüklüğünü yaptığımız transactiona göre belirlememiz gerekir.Daha değişik yöntemlerlede bu büyüklük ayarlşarı siz edilebilir.

Rollbak segmentlerin durumu ile ilgili yine çeşitli raporlar almak mümkündür.

SQL> SELECT class, count FROM v$waitstatWHERE class LIKE ‘%undo%’;

yadaSQL> SELECT sum(value) FROM v$sysstatWHERE name IN (‘db block gets‘, 'consistent gets‘);

yadaSQL> SELECT sum(waits)* 100 /sum(gets) "Ratio",sum(waits) "Waits", sum(gets) "Gets"FROM v$rollstat;

Her bir class için beklemem sürlerinin toplamının oranı % 1 den daha düşük olmalıdır.Eğer % 1 i geçerse birkaç tane daha rollback segment tanımlamak gerekebilir.

Page 3: Rollback Segmentleri̇n Opti̇mi̇zasyonu

Anar Godjaevhttp://anargodjaev.wordpress.com/

Çok uzun çalışan transactionlar için large rollback tanımlamak gerekir.

SQL> SET TRANSACTION USE ROLLBACK SEGMENT large_rbs;

Yada

SQL> EXECUTE dbms_transaction.use_rollback_segment(’large_rbs‘);

Rollback data ayarlamak için yapılan transcation’un trü çok öenmlidir.

Delete işlemi çok maliyetlidir.

İnsert işlemleri minimum Rollback segment ihtiyacı duyar.

Update işleminin maliyeti kaç adet row’un işlem gördüğüne bağlıdır.

Aşağıdaki Sql cümlesi ile kontroller yapılabilir.

SQL> SELECT s.username, t.used_ublk, t.start_timeFROM v$transaction t, v$session sWHERE t.addr = s.taddr;

Delete işlemleri çok fazla rollback segment kullandığı için eğer tüm tablo üzerinde bu işlem yapılıyorsa kesinlikle truncate kullanılmalıdır.

Rollback segmentlerin kullanımını şu örneklede inceleyebilir.

Statementtan önce,

SQL> select usn,writes from v$rollstat;USN WRITES--------- ---------0 19621 11026862 325383 1226096

SQL> update employees set salary=1000;6560 rows updated.

Statementtan sonra,

SQL> select usn,writes from v$rollstat;

Page 4: Rollback Segmentleri̇n Opti̇mi̇zasyonu

Anar Godjaevhttp://anargodjaev.wordpress.com/

USN WRITES--- -------0 19621 22322702 325383 1226096

Eğer düşük oranda rollback segment ihityacı görmek istiyorsak uzun cümlerde daha sık aralıkla commit yapmalıyız.

Genellikle uzun çalışan sql cümlelerinde şu hatayı alırız.Snapshot too old.Bu hatanın sebebi.Başlayan bir transcation devam ederken server proses rowların eski halini rollback segmentlerde bulamıyabilir.Rowların eski halleri undo_retention paramtersi kadar rollbacklerde muhaza edilir.Eğer bu değeri geçen bir süre işlem devam ederse rollback üzerindeki eski bloklara tekrar kullanım yapılır.Bu durumu engellemek için ya undo_retention değeri arttırlmalıdr yada Undo segment boyutu arttırlmalıdır.

İstenirse rollback segmentler Autoextend yapılırak otomatik olarak büyümeleri sağlanabilir.

Undotablespace ler üzerinde kelem silme alter etme gibi işlemleri normal tablespace lerde olduğu gib yapabilemteyiz.

SQL > ALTER TABLESPACE undotbs1ADD DATAFILE ‘/u02/oradata/testdb/undotbs1_02.dbf’AUTOEXTEND ON;

Aktif bir undo segmenti offline yapamayız.

SQL > ALTER SYSTEM SET UNDO_TABLESPACE=UNDOTBS2; kullanılan undo segmenti bu komutla switch edebiliriz

SQL > DROP TABLESPACE UNDOTBS_2;bu komutla tablespace i drop edebiliriz.

UNDO_MANAGEMENT: Undo yönetiminin otomatik yada Manuel olmasını sağlar.

UNDO_TABLESPACE: Undo için hangi tablespace’in aktif olduğunu belirler.

UNDO_SUPPRESS_ERRORS: Değeri True yapılırsa manuel yapılan işlemelrde hataları görmemizi sağlar.

UNDO_RETENTION: Rolback segmentte eski değerlerin ne kadar duracağını belirler.