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 ;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
DROP TABLE ERDEM.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 (‘erdem’,25,’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.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
DROP TABLE ERDEM.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 (‘erdem’,25,’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;
1
2
|
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.
Hiç yorum yok:
Yorum Gönder