Oracle’ da tablo create ederken eğer tablonun tipini belirtmez iseniz default
olarak ilişkisel ve kalıcı olarak tablonuzu oluşturacaktır. Create table
komutunuz içerisinde global temporary ifadesini kullanırsanız temporary
segmentlerde tutacağınız geçici bir tablo create etmiş olursunuz. Temporary tabloları normal tablolardan çok
farklı olarak düşünmemek gerekir, bildiğimiz yöntem (create table ile ) ile
create etmiş olduğunu tablolar üzerinde neler yapabiliyorsanız burada da
yapabilirsiniz. Temporary olmasından kaynaklı olarak, temporary olarak create
edilmiş bir tablo tüm sessionlar tarafından görülebilir ve sadece o session
içerisinde varlığını idame ettirir, session sonlandığında temporary table’ da
otomatik olarak drop olacaktır.
Temporary table’ ın sytanx’ ından biraz bahsedelim;
CREATE [ GLOBAL TEMPORARY ] TABLE
[ schema. ]table
[ (relational_properties) ]
[ ON COMMIT { DELETE | PRESERVE } ROWS ]
[ physical_properties ]
[ table_properties ] ;
Aslında standartın dışında çokm fazla bişey yok, sadece
create komutunun başında global temporary ifade var, sonunda iki farklı
opsiyonu olan ON COMMIT PRESERVE ROWS veya ON COMMIT DELETE ROWS
komutu yer alıyor. Bunların ne ifade ettiğinden bahsedeceğiz. Burada
şunu hemen belirtelim temporary tablolar üzerinde yapılan DML işlemleri (yani
özellikle update, insert, delete operasyonları) normal tablo üzerinde yapılan
DML işlemlerine göre gayet hızlı olacaktır. Çünkü temp tablolar üzerinde
yapılan işlemler (temp tablolar yapısı gereği nologging create edilirler) log
üretmezler (yani burada yapılan işlemlere ait redo kaydı oluşmaz) dolayısıyla
da daha hızlı transactionlar olacaktır. Baştada belirttiğim gibi bu tabloları
çalışma mantığı açısından (session bazında olduğunu saymazsak) çok da bir fark
yok aslında, temp tablolar üzerinde index create edebilirsiniz. Eğer bir
yazılımcı olsaydım elimden geldiğince transactionım içerisinde temp tabloları
kullanmaya çalışırdım. Eğer bir sürü join ile bir tablodan veri almak benim
işimi çok uzatıyor ise, aynı transaction ile bu veriyi daha basit bir query ile
temp bir tabloda oluşturup, sonrasında ihtiyacım varsa indexlerini create edip
burdan kullanmak zaman ve performans açısından çok daha verimli olabilir.
Tablomuzu create ederken, create komutumuzun sonunda iki
farklı komut eklememiz gerektiğinden bahsettik, şimdi bunu açıklayalım ;
ON COMMIT DELETE ROWS ; Bu komutu kullanırsanız
oluşturduğunuz temp tablo içerisindeki verileriniz gönderdiğiniz her COMMIT’ de
otomatik olarak silicek demektir.
ON COMMIT PRESERVE
ROWS ; Eğer bu komutu kullanırsanız açtığınız session boyunca temp tablo
kalıcı olarak duracaktır, sessionı sonlandırdığınız anda tüm verilerinizi
kaybedeceksiniz demektir.
Temp tabloyu create ederken bu iki komutu da kullanmaz
iseniz tablonuz default olarak ON COMMIT DELETE ROWS ile create edilecektir. (ki default opsiyonu
budur)
Bunlarla ilgili bir örnek yapalım ;
DROP TABLE KAMIL.TEST;
Table dropped.
CREATE GLOBAL TEMPORARY TABLE KAMIL.TEST
(
AD VARCHAR2(20 BYTE),
NO NUMBER(5),
ADRES VARCHAR2(30 BYTE)
)
ON COMMIT DELETE ROWS ;
Table created.
insert into test values ('ahmet',15,'istanbul') ;
1 row created.
insert into test select * from test ;
1 row created.
select count(*) from test ;
COUNT(*)
----------
2
1 row selected.
commit;
Commit complete.
select count(*) from test ;
COUNT(*)
----------
0
1 row selected.
Commit ile birlikte tüm data silinmiş oldu. PRESERVE seçeneği create edilmiş olduğunda
commit de herhangi bir data kaybı yaşanmıyor ancak session sonlandığında
datalarda otomatik olarak siliniyor.
DROP TABLE KAMIL.TEST;
Table dropped.
CREATE GLOBAL TEMPORARY TABLE KAMIL.TEST
(
AD VARCHAR2(20 BYTE),
NO NUMBER(5),
ADRES VARCHAR2(30 BYTE)
)
ON COMMIT PRESERVE ROWS ;
Table created.
insert into test values ('ahmet',15,'istanbul') ;
1 row created.
insert into test select * from test ;
1 row created.
select count(*) from test ;
COUNT(*)
----------
2
1 row selected.
commit;
Commit complete.
select count(*) from test ;
COUNT(*)
----------
2
1 row selected.
Yine bir ekleme yapmak istiyorum. Temp tablolar parallel
transactionlar ile select edilebilirler. (Bunu şu yüzden yazmak istedim, oracle
8i’ de bu özellik yoktu)
Bir sessionda aşağıdaki query’ i çalıştırıp;
select /*+
parallel (test,16) */ count(*)
from test
order by 1,2 desc
Diğer bir sessionda da aşağıdaki query ile parallel
sessinoları select ettiğimde ;
QCSID COUNT(SID)
125 17
125 nolu sid’ ye ait kendisi ile
bilikte 16 tane parallel sesisonda bu sorguyu çalıştığını görebiliyorum. Aynı
koşullar tüm DML işlemleri içinde geçerlidir.
Kamil TÜRKYILMAZ
www.kamilturkyilmaz.com
Kamil TÜRKYILMAZ
www.kamilturkyilmaz.com
Hiç yorum yok:
Yorum Gönder