Hurriyet

13 Kasım 2013 Çarşamba

Oracle Veritabanı: Partitioning - Partition Tipleri - Partition'lar Nasıl Yaratılır?


Oracle Veritabanının partition yaratma, oluşturma özelliği  bize data segment'leri üzerinde bulunan tablo ve index gibi dataları daha kolay yönetme ve performans sağlama imkanı verir. Partition yaratmak için bir sürü opsiyon bulunur. Bunlar sırasıyla range, list, hash, range/list ve range/hash'tir. 

Partition yapıldığında tablo veya index gibi object'leri birden fazla segmente ayırırken yapıyı aynı tutmaktadır. En fazla karşılaşılan partition'lara ayırma tercihi range partitioning'dir.

Range Partitioning Nedir?

Range Partitioning'de tablodaki belirli değerlere göre ayrışma yapılır. Her partition'a göre belirli bir ayrım yapılır. Bu partition belirli bir kolondaki değerlere göre yapılır. Örneğin bir tabloda bulunan veriler gruplanabilirse range partition için güzel bir örnek olur.

Örnek olarak aşağıdaki tabloyu ele alabiliriz.

 create table deneme2 (isim varchar2(20),soyisim varchar2(30),yas number)  
 partition by range(yas)  
 (  
 partition a values less than (20) tablespace USERS,  
 partition b values less than (40) tablespace USERS1  
   
 )  
 ;  
 select * from deneme2;  
   
 drop table deneme2 purge;  

Buradaki syntax'da ayrıca partition'lar tablespace'lere dağıtılmıştır. Tablespace'lere dağıtılmadan da yapılabilinir. Yani aşağıdaki gibi yapılabilinir:

 create table deneme2 (isim varchar2(20),soyisim varchar2(30),yas number)  
 partition by range(yas)  
 (  
 partition a values less than (20) ,  
 partition b values less than (40)   
   
 )  
 ; 

Buradaki örnekte yarattığımız tabloda 3 tane kolon bulunmaktadır. Bunlar isim,soyisim ve yas'tır. Bu kolonlardan seçtiğimiz yas kolonu içindeki değerlere göre ayrım yapmaktayız. Eğer kişinin yaşı 20'den küçükse tablonun partition'ını USERS tablespace'inde yarat, 40'dan küçükse USERS1 tablespace'inde yarat şeklinde ayırmaktayız.

Bu ayrımı yaptıktan sonra DBA_TABLES sorgulanırsa partitioned kolonu "Yes" olarak işaretlenmiştir.


  • Partitioned Olup Olmadığını Nasıl Bulabiliriz?

select * from dba_part_tables whwere table_name like '%tablo_adı%';


Aynı şekilde index'in partitioned olup olmadığını  aşağıdaki gibi bulabiliriz.

select * from dba_part_indexes whwere table_name like '%tablo_adı%';


  • Tabloların Partition'larını Nasıl Görebiliriz?

select * from dba_tab_partitions whwere table_name like '%tablo_adı%';

  •  Özel Olarak İstediğimiz Partition'dan Select Çekmek:
SQL> Select * from deneme2;  
SQL> Select * from deneme2 partition(a);  

  • Partition Eklemek:
SQL> Alter table deneme2 add partition c values less than(60);

  • Partition Çıkarmak:
 SQL> Alter table deneme2 drop partition c;  



List Partitioning Nedir?

List partitioning'de  belirli bir aralığa göre ayırmaktansa, sınırlı seçeneklerimiz bulunan bir sıralama yaparız. Yani  aşağıdaki örneğimize göre ismi "Ali" olanlar a partition'ında, "Veli" olanlar ise b partition'ında yerleştirilirler.

 create table deneme2 (name varchar2(20),surname varchar2(30),age number)  
 partition by list(name)  
 (  
 partition a values ('ALI'),  
 partition b values ('VELI')  
   
 )  
 ;  
 select * from deneme2;  
 drop table deneme2 purge;  

Hash Partitioning Nedir?

Eğer tablomuzdaki değerleri belirli bir kümeye sokamıyorsak ya da belirli aralıklara bölemiyorsak, hash partitioning yapmamız gerekebilir. Örneğin bir tablomuz var ve bu tablo sürekli büyümekte. Bu tablomuzunda sürekli artan bir primary key'i var. Bu tabloda belirli bir ayrım yapamayacağımız için bu artan primary key'e göre partition'lar yaratabilir ve yaratılan partition'ların hepsi eşit sayıda satır tutabilir. Böylece belirli koşullara göre bölemeyeceğimiz bir tabloyu hash partitioning ile belirli miktarlar tutacak şekilde ayırabiliriz.

 create table deneme2 (name varchar2(20),surname varchar2(30),age number)  
 partition by hash(age)  
 partitions 3  
 ;  




1 yorum: