ORACLE PARTITION-SUBPARTITION

Tabloların boyutları büyüdükçe yapılacak olan select,insert,update gibi işlemler yavaşlar.Bir tablodaki veriler gigabyte seviyesine kadar gelir belki de daha fazla.İşte bu gibi durumlarda o tabloyu belli özelliklere göre partition yani bölümlere ayırırız.Ve böylece artık işlemlerimizi çok daha hızlı yaparız.Partitionların bir diğer güzel yanı Oracle’ın bize istediğimiz partition’u istediğimiz tablespace’e taşımamıza yada istediğimiz yerde yaratmamıza izin veriyor olmasıdır.Zaten burda amaç bir tablespace çok fazla veri ile dolduğu zaman yeni kayıt yeri olmaması ve bu verileri başka yere taşımaktır.Örneğin ilk bilgisayar sistemlerine geçildiği zaman herkesin kütük bilgileri yani TC Kimlik Numarasına göre basit kayıtların yapıldığını düşünelim.Zamanla bu tablo o kadar büyüyecekki herkesin kaydı oraya alıcak ve hergeçen gün de artmaya devam edecek.Bir süre sonra tablo üzerinde insert,select işlemi gibi işlemler çok yavaşlayacak.Hele ki diğer kurumlarda bu tablodan TC Kimlik No ya ulaşığ işlemleri buna göre yapıyorlarsa işte size partition ve subpartition :) Yıllara göre partition yapsak bu yavaşlıktan kurtuluruz.



Range Partition: Belirli bir limit aralığı

Hash Partition: Hash fonksiyonunun ürettiği sonuca göre

List Partition: Belli bir liste yaparak o liste baz alınarak yapılan partition

Range-Hash Partition: Range’e göre partition ve Hash’e göre subpartition

Range-List Partition: Range göre partition ve List’e göre subpartition



Evet örneğe geçmeden bir tablo içinde veri olmadan partition yapılmalıdır ki veriler o partition’a göre kaydedilsin.Ve eğer içi veri dolu bir tabloya partition yapmak istiyorsanız şu adımları izlemelisiniz.

1-Partition yapılmak istenen tabloyla eşdeğer fakat farklı isimde bir tablo yaratmak

2-Yaratılan tabloya partition yapmak

3-Verileri eski tablodan yeni yani partitionlu tabloya taşımak

4-Eski tabloyu silmek

5-Yeni tablonun adını eski tablonun adı olarak değiştirmek



Şimdi Range partitiona örnek verelim.Doğum tarihe göre partition yapacak olursak;



PARTITION BY RANGE(DOGUM_TARIHI)

(

PARTITION DOGUM_TARIHI_1990DAN_KUCUK VALUES LESS THAN(TO_DATE(’01.01.1990′,’DD.MM.YYYY’)),

PARTITION DOGUM_TARIHI_2000DEN_KUCUK VALUES LESS THAN(TO_DATE(’01.01.2000′,’DD.MM.YYYY’)),

PARTITION DOGUM_TARIHI_2010DAN_KUCUK VALUES LESS THAN(TO_DATE(’01.01.2010′,’DD.MM.YYYY’)),

PARTITION DOGUM_TARIHI_2010DAN_BUYUK VALUES LESS THAN(MAXVALUE)

);



Evet Doğum Tarihine göre tablomuzu partitionlara böldük.Burada özel bir MAXVALUE anahtarını kullandık ki bu en büyük kayıt aralığını tutuyor.Kayıt olmayan bir alana denk gelip Oracle hata vermesin diye.Diyelim ki 2010 yılından büyük kaç kayıt olduğunu öğrenmek istiyoruz.Biz biliyoruz ki Doğum Tarihi 2010 yılından büyük olan kişiler DOGUM_TARIHI_2010DAN_BUYUK partitionunda kayıtlı.



SELECT COUNT(TC_KIMLIK_NO) FROM KISILER PARTITION (DOGUM_TARIHI_2010DAN_BUYUK);



Yukarıdaki sorgu ile Tablodaki 4 partition dan sadece 1 tane si üzerinde sorgu yürütülecek ve sonuçları bize getirecektir.Eğer partition olmasaydı bütün tablo üzerinde sorgu yürütülecekti.Mesela ülkemizde Doğum Tarihi 2010′dan küçük 70 milyon ve 2010′dan büyük 2 milyon insan olsun.Böyle bir sorgu ile 72 milyon kayıt yerine 2 milyon kayıt üzerinde sorgumuz çalışacaktır ve bu bize yüksek performans ve düşük zamandan kazandıracaktır.



Bir de List partitiona örnek yazalım.Diyelim ki her kayıt için Erkek ve Kadın diye Cinsiyet tutulsun.İşte biz de bu sefer cinsiyete göre listeli partition yapacağız.



PARTITION BY LIST(CINSIYET)

(

PARTITION ERKEK_LISTESI VALUES(‘ERKEK’),

PARTITION KIZ_LISTESI VALUES(‘KADIN’)

);



Bazen partitionlarda da çok fazla veri olur.Ve çözüm olarak da subpartition gerekir :)

Örnek olması açısından yukarıdaki örnekleri birleştirerek Range-List partition yapmış oluru.Yani Range partition List Subpartition olmuş olur.



PARTITION BY RANGE(DOGUM_TARIHI)

PARTITION BY LIST(CINSIYET)

(PARTITION DOGUM_TARIHI_2010DAN_KUCUK VALUES LESS THAN(TO_DATE(’01.01.2010′,’DD.MM.YYYY’))

(

SUBPARTITION ERKEK_LISTESI VALUES(‘ERKEK’),

SUBPARTITION KIZ_LISTESI VALUES(‘KADIN’)

)

(PARTITION DOGUM_TARIHI_2010DAN_BUYUK VALUES LESS THAN((MAXVALUE)))

(

SUBPARTITION ERKEK_LISTESI VALUES(‘ERKEK’),

SUBPARTITION KIZ_LISTESI VALUES(‘KADIN’)

);



Sistemdeki tüm partitonları görmek için;



SELECT * FROM ALL_TAB_PARTITIONS;



Kullanıcıya ait partitionları görmek için;



SELECT * FROM USER_TAB_PARTITIONS;



İle partitionların hangi tablo ya ait olduğunu hangi tablespace de olduğunu ayrıntılı olarak görebilirsiniz.

Bir tabloya ait partitionları görmek için ise;



SELECT * FROM USER_TAB_PARTITIONS WHERE TABLE_NAME LIKE ‘KISILER’ ;
Share:
spacer

1 yorum: