Üye Kayıt Üye Giriş

SQL ve UNDO Üretimi / Append Hint


SQL ve UNDO Üretimi / Append Hint

 

statistikleri incelerken google üzerinden yapılan bir arama gözüme çarptı. Aramada bir SQL sorgusunun nasıl UNDO üretmemesini sağlayacağımız aranmaktaydı. Kısaca bununla ilgili yazmak istedim.

Öncelikle undo’nun ne olduğunu anlamak için tıklayınız.

Undo okuma tutarlılığı ve eşzamanlılığı açısından olmazsa olmazdır. Her redo üreten işlemin undo üretmeyeceği gibi her undo üreten işlemin redo üreteceğini söyleyebiliriz. Yani redo > undo. Bir transaction, veriyi modifiye ettiği zaman undo üretilir. Rollback operasyonu ve veritabanını kurtartma durumlarında undo gerekmektedir.

Redo değişimleri sembolize ederken, undo geriye dönülmesi muhtemel değişimleri sembolize eder. Örneğin SELECT … FOR UPDATE veya UPDATE gibi ifadeler hem redo hem de undo üretirler. Undo üretimini bypass etmenin bir yolu yoktur. Undo, undo edilmesi gereken yani geri alınması gereken bilgileri içeren segment’lere sahiptir. Redo’nun ise bir log dosyası vardır. Sonuç ne olursa olsa her undo üretimi mutlaka log’lanmalı, redo bilgisi üretilmelidir.

Undo üretimini azaltmak istiyorsanız APPEND hint’ini veya NOLOGGING özelliğini kullanabilirsiniz. Ancak dikkat, bu undo üretimini azaltacağı gibi redo üretimini de azaltacaktır. Redo oluşmasını istiyorsanız undo da oluşacaktır. APPEND veya NOLOGGING özelliklerinin ise undo ile bir ilgisi, direkt olarak yoktur.

Undo ayrıca flashback table ve flashback query için de gerekmektedir. Bu flashback özellikleri undo segment’lerini kullanmaktadır.

Bu konuyla ilgili bir örnek göstermek istiyorum. Bu örnekte undo segment’lerinin nasıl kullanıldığı ve insert – delete arasındaki undo üretim farkının göstermeye çalışacağım.

1 SQL> conn ogan/password;
2 Connected.

–> ogan kullanıcısı ile sisteme bağlandık ve herhangi bir işlem gerçekleştirmedik.

1 SQL> select tr.XIDUSN "Undo Segment Numarasi", tr.UBAFIL "Undo Blok Adresi", tr.START_TIME "Baslangic Zamani",
2 tr.USED_UBLK "Kullanilan Undo Bloklari", tr.USED_UREC "Kullanilan Undo Kayitlari", LOG_IO "Mantiksal I/O", PHY_IO "Fiziksel I/O"
3 fromv$transaction tr, v$session se
4 where tr.ses_addr = se.saddr
5 andusername='OGAN';
6  
7 norows selected

–> Herhangi bir transaction kaydımız bulunmamakta.

1 SQL> settransactionname'OGAN';
2  
3 Transactionset.

–> Transaction’ın adını OGAN olarak değiştirdim.

1 SQL> create table ogan_deneme
2    as
3    select * from all_users;
4  
5 Table created.

–> ogan_deneme adında bir tablo yarattık ve içerisinde bütün kullanıcıların bilgisi bulunmakta.

1 SQL> select sq.sql_fulltext "Sorgu", tr.XIDUSN "Undo Segment Numarasi", tr.UBAFIL "Undo Blok Adresi", tr.START_TIME "Baslangic Zamani",
2 tr.NOUNDO "Undo Uretmeyen Transaction", tr.NAME"Transaction Ismi",
3 tr.USED_UBLK "Kullanilan Undo Bloklari", tr.USED_UREC "Kullanilan Undo Kayitlari", LOG_IO "Mantiksal I/O", PHY_IO "Fiziksel I/O"
4 fromv$transaction tr, v$session se, v$sql sq
5 where tr.ses_addr = se.saddr
6 andusername='OGAN'
7 and se.sql_id = sq.sql_id;
8  
9 norows selected

–> Hala bir kaydımız bulunmuyor.

01 SQL> insert into ogan_deneme
02    select * from ogan_deneme;
03  
04 594 rows created.
05  
06 SQL> select tr.XIDUSN "Undo Segment Numarasi", tr.UBAFIL "Undo Blok Adresi", tr.START_TIME "Baslangic Zamani",
07   2  tr.NOUNDO "Undo Uretmeyen Transaction", tr.NAME"Transaction Ismi",
08   3  tr.USED_UBLK "Kullanilan Undo Bloklari", tr.USED_UREC "Kullanilan Undo Kayitlari", LOG_IO "Mantiksal I/O", PHY_IO "Fiziksel I/O"
09   fromv$transaction tr, v$session se
10    where tr.ses_addr = se.saddr
11   andusername='OGAN';
12  
13 Undo Segment Numarasi Undo Blok Adresi Baslangic Zamani                                                                                                                                                                                                                                            Kullanilan Undo Bloklari Kullanilan Undo Kayitlari Mantiksal I/O Fiziksel I/O
14 ---------------------------------------------------------------------
15                    40              785 12/21/10 11:16:06
16 ---------------------------------------------------------------------
17 1                         4            80            0

–> Kullandığı undo segment numarası 40, undo blok adresi 785. Kullanılan undo bloklari 1, kullanılan undo kayitlari ise 4. Yaptığı mantıksal I/O 80 ve fiziksel I/O 0. Şimdi commit etmeden veri girişine devam edelim;

01 SQL> insert into ogan_deneme
02    select * from ogan_deneme;
03  
04 1188 rows created.
05  
06 SQL> insert into ogan_deneme
07    select * from ogan_deneme;
08  
09 2376 rows created.
10  
11 SQL> insert into ogan_deneme
12    select * from ogan_deneme;
13  
14 4752 rows created.
15  
16 SQL> insert into ogan_deneme
17    select * from ogan_deneme;
18  
19 9504 rows created.
20  
21 SQL> insert into ogan_deneme
22    select * from ogan_deneme;
23  
24 19008 rows created.
25  
26 SQL> insert into ogan_deneme
27    select * from ogan_deneme;
28  
29 38016 rows created.

–> Duruma tekrar bakalım;

01 SQL> select tr.XIDUSN "Undo Segment Numarasi", tr.UBAFIL "Undo Blok Adresi", tr.START_TIME "Baslangic Zamani",
02 tr.USED_UBLK "Kullanilan Undo Bloklari", tr.USED_UREC "Kullanilan Undo Kayitlari", LOG_IO "Mantiksal I/O", PHY_IO "Fiziksel I/O"
03 fromv$transaction tr, v$session se
04 where tr.ses_addr = se.saddr
05 andusername='OGAN';
06  
07 Undo Segment Numarasi Undo Blok Adresi Baslangic Zamani                                                                                                                                                                                                                                                 Kullanilan Undo Bloklari Kullanilan Undo Kayitlari Mantiksal I/O Fiziksel I/O
08 --------------------------------------------------------------------
09                    40              785 12/21/10 11:16:06
10 --------------------------------------------------------------------
11 12                       451          3277           11

–> Hala aynı segment numarası ve undo blok adresini kullanıyoruz ancak kullanılan undo blokları ve kayıtlarında artış var. Ürettiğimiz redo ve undo artmakta ve bununla beraber fiziksel ve mantıksal okuma da kümülatif olarak yükselmekte. Şu anda commit edersek;

01 SQL> commit;
02  
03 Commit complete.
04  
05 SQL> select tr.XIDUSN "Undo Segment Numarasi", tr.UBAFIL "Undo Blok Adresi", tr.START_TIME "Baslangic Zamani",
06 tr.NOUNDO "Undo Uretmeyen Transaction", tr.NAME"Transaction Ismi",
07 tr.USED_UBLK "Kullanilan Undo Bloklari", tr.USED_UREC "Kullanilan Undo Kayitlari", LOG_IO "Mantiksal I/O", PHY_IO "Fiziksel I/O"
08 fromv$transaction tr, v$session se
09 where tr.ses_addr = se.saddr
10 andusername='OGAN';
11  
12 norows selected

Gördüğünüz gibi her insert işleminden sonra rollback operasyonu için yeni undo bloklarına ihtiyaç duyuldu. Bu undo blokları olmasaydı rollback operasyonunu nasıl yapabilecektir?

Bir başka örnek;

01 SQL> drop table ogan_deneme;
02  
03 Table dropped.
04  
05 SQL> create table ogan_deneme
06   asselect* from all_users;
07  
08 Table created.
09  
10 SQL> select tr.XIDUSN "Undo Segment Numarasi", tr.UBAFIL "Undo Blok Adresi", tr.START_TIME
Bilgisayar Dershanesi Ders Sahibi;
Bilgisayar Dershanesi

Yorumlar

Yorum Yapabilmek İçin Üye Girişi Yapmanız Gerekmektedir.

ETİKETLER