Oracle Temporary Tables

Temporary Tables: Geçici tablolar(temporary tables) bir transaction veya session süresince ara sonuç kümleri saklayan tablolardır. Geçici tablolarda data, session bazında tutulmaktadır. Bir başka sessiondan, diğer sessionların temporary table’da tutuğu data görülememektedir. Sessionlarda datayı oluşturan transactionlar commitlenmiş dahi olsa bu izolasyon sürmektedir. Birden çok kullanıcılı sistemlerin bu tablolara erişimleri birbirlerini hiç bir şekilde engellememktedir. Bir temprorary table’ı lock’lasak dahi, diğer sessionlar bu lock’dan etkilenmeyeceklerdir ve bu tablolara yazma yönündeki erişimlerini sürdürebileceklerdir. Bu tabloların bir diğer önemli özelliği ise normal tablolara göre daha az redo üretmesidir.  Delete ve update işlemlerinde daha fazla select ve insert işlemelerinde daha az redo üretirler ama bu redo üretimi normal tablolardan daha öncede dediğim gibi daha azdır.

Geçici tablolar’a yer tahsisi, user’ın oturum açmış olduğu geçici tablespace alanından yapılır.  Bir temporary table oluşturulurken herhangi bir storage tahsisi yapılmamaktadır. Ne zaman tablo  insert almaya başlarsa, insert aldığı session’a ait geçici segmentler üzerinden tablo için yer ayrılmaya başlanır. Bu işlemde yine sessiın bazında yapılmaktadır. Her session bu tabloları bağımsız kullandıklarından dolayı geçici yer sadece insert işlemini yapan session’ın geçici tablespace’inde ayrılmış olur. Diğer sessionlarda herhangi bir yer tahsisi yapılmamaktadır. Bunun nedenini her user’ın farklı geçici tablespace kullanmalarına bağlayabiliriz.

Temporary tables session bazlı olabileceği gibi transaction tabanlıda olabilmektedir. Şimdi Temporary tables’ın nasıl Create edildiğini ve davranış özelliklerini inceleyelim.

CREATE GLOBAL TEMPORARY TABLE globaltemp_1
(
cola NUMBER
)
ON COMMIT PRESERVE ROWS;

CREATE GLOBAL TEMPORARY TABLE globaltemp_2
(
cola NUMBER
)
ON COMMIT DELETE ROWS;

Evet yukarıda gördüğümüz gibi 2 farklı çalışma özelliği ile temporary table’ımızı create edebildik. Şimdi bu 2 özelliği açıklamak gerekirse. ON COMMIT PRESERVE ROWSseçeneği ile tablomuzu create edersek tablo içindeki data doğrudan session tabanlı olur ve session sonlanana kadar içeride datayı saklamayı devam eder. Eğer ON COMMIT DELETE ROWS seçeneği ile tabloyu create edersek, tablo transaction bazlı çalışmaya devam eder ve içindeki datayı transaction sonlanana kadar yani doğrudan commit veya implicit(Create, Alter,Drop,Truncte,Grant… vb) commit içeren bir komut çalıştırılana kadar içindeki datayı saklar. Transaction sonlandığı takdirde içerisindeki datada doğrudan silinmektedir. Eğer tablo yaratırken bu 2 seçenekten herhangi birini vermez isek tablo default olararak ON COMMIT DELETE ROWS seçeneği ile create edilir.

Şimdi tablomuza bir kaç değer insert edip sonuçları görelim, daha sonra transaction’ı sonlandırıp sonuçları inceleyelim.

CREATE GLOBAL TEMPORARY TABLE globaltemp_2
(
cola NUMBER
)
ON COMMIT DELETE ROWS;

INSERT INTO globaltemp_2
VALUES (5);

SELECT *
FROM globaltemp_2;

Şimdi commit çalıştıralım ve sonucu görelim.

COMMIT;

SELECT *
FROM globaltemp_2;

— Sonuc: Tüm tablo delete edilmiş durumda

Temporary table’ların kullanımı için değiniceğimiz bir kaç noktaya bakıcak olursak;

Yazdığımız stored procedurelerde, run time ‘da DDL çalıştırmaktan kaçınmalıyız. Run time’da DDL çalıştırmak oldukça maliyetli bir işlem olduğundan temporary table’ımızdan performans anlamında çokta faydalanamayabiliriz. Bu sebepten dolayı eğer uygulama bağımlı temporary table a ihtiyaç duyuyorsak, bu tabloları yordamların içinde run timeda create etmekten kaçınmalıyız.

Geçici tablolar daha az redo ürettiği için transaction zamanı olarak oldukça hızlıdırlar, bu yüzden sorgu sonuçlarımızı ara tablolarda saklama ihtiyacımız olduğu durumalarda temporary table kullanmak bize hız ve performans kazandıracaktır.

DB link ile başka bir DB’den CLOB bir alan çekme ihtiyacınız var ise, bu CLOB alanı temporary table a alıp kullanmamızda mümkün. DB link ile CLOB alana erişmenin problem yarattığını düşünürsek bu yolla bu problemi aşmış olmaktayız.

Şimdi ise Temporary Tables’da yapabileceğimiz ve yapamıyacağımız işlemlere, özelliklere bakalım.

1- Temporary table üzerinde index yaratılabilir.

2- Temporary table’lar ile view’lar oluşturulabilir. Kalıcı tablolar ile kombinasyonlar oluşturuabilir.

3- Temporary tablelar referential integrity constraint’e sahip olamazlar. Ne hedef gösterilebilirler nede hedef gösterebilirler.

4- NESTED TABLE tipinde kolon bulunduramazlar. Oracle 9i ve öncesine kadar VARRAY tipindede kolon bulunamazken Oracle 10g ile beraber bu kısıtlamada ortadan kalkmış oldu.

5- Temporary tablelar index organized table olamazlar.

6- Herhangi bir cluster’a ait bir tip olamazlar.

7- Temporary tablelara partition yapılamamaktadır.

8- Bu tablolar analyzed söz deyimi kullanılarak analiz edilemezler. Bu yolla istatistik sahibi olamazlar.

9- Eğer temporary table’lar analiz edilmek isteniyorsa izlenecek yöntem aşağıdaki gibidir.

exec dbms_stats.gather_schema_stats( schema_user, gather_temp=>TRUE );

Ancak ON COMMIT DELETE ROWS ile yaratılmış tabloda toplanan istatistiğini doğruluğuna güvenilmemelidir. ON COMMIT PRESERVE ROWS ile yaratılan tablolarda toplanan istatistik daha güvenli ve doğrudur.

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: