joomla templates Data Warehouse Türkiye

Wed08242011

Last update07:32:32 PM GMT

Back Home
Salı, 05 Nisan 2011 20:29

Global Temporary Table Oluşturmak

Yazan&Gönderen  Kamil TURKYILMAZ
Bu Öğeyi Derecelendir
(0 Oylar)

Oracle’ da tablo create ederken eğer tablonun tipinibelirtmez iseniz default olarak ilişkisel ve kalıcıolarak tablonuzu oluşturacaktır. Create table komutunuziçerisinde global temporary ifadesini kullanırsanıztemporary segmentlerde tutacağınız geçici bir tablocreate 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ümsessionlar tarafından görülebilir ve sadece o sessioniçerisinde varlığını idame ettirir, session sonlandığındatemporary 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 TURKYILMAZ

Kamil TURKYILMAZ

1979  Tokat/Zile doğumluyum. Yıldız Teknik Üniversitesi 1997 – 2001 mezunuyum ancak 1998 yılından itibaren  IT sektöründe, 2000 yılından bu yanada Oracle üzerine çalışmaktayım. 2005 yılına kadar oracle database’i üzerine yazılmış olan kimi uygulamalara software support  hizmeti, son 6 yıl ise oracle veritabanı yöneticiliği olmak üzere yaklaşık 11 yıldır sektör içerisindeyim. Oracle’ ın hemen hemen tüm ürünlerinin kurulumu, konfigurasyonu, yönetimi konusundaki çalışmalarıma devam etmekteyim. Son 2 yıldır da özel bir bankada oracle dba olarak çalışmaktayım. Aynı zamanda kimi bilişim sitelerinde yazarlık yapıyorum, bunun yanısıra bu alandaki deneyim ve tecrübelerimi daha fazla kişiyle paylaşabilmek adına bir de oracle blog  yazarıyım.

Website: www.kamilturkyilmaz.com E-posta: Bu e-Posta adresi istek dışı postalardan korunmaktadır, görüntülüyebilmek için JavaScript etkinleştirilmelidir

Login to post comments