Merhaba Arkadaşlar,

Bu yazımda sizlere hemen hemen Tüm Veritabanı yönetim sistemlerinde var olan Partitioning gibi güzel bir teknolojiyi anlatacağım. Partitioning kavramının türkçesi bölümleme olsada benim açımdan en güzel Türkçesi Böl, Parçala ve Daha Rahat Yönet şeklindedir. Özellikle çok büyük tablolarda partitioning olmazsa olmaz bir özellik olarak karşımıza çıkmaktadır. Şimdi neden bu kadar önemli olduğunu ve tam olarak ne olduğunun detayına girelim.

Oracle Partitioning

Gün geçtikçe kurumların verilerinin büyüklüğü inanılmaz oranlarda artmaktadır. Eskiden Megabyte larla tartıştığımız kurumların verilerinin yerini artan ihtiyaçlar doğrultusunda artık Terabyte ve Petabyte larla ifade edebilmekteyiz. Veriler inanılmaz biçimde arttıkça onu daha kolay bir şekilde yönetebileceğimiz teknolojilerde ortaya çıkmaktadır. İşte Partitioning teknolojisi bunlardan birisidir ve Oracle Veritabanı yönetim sistemine bu teknoloji Oracle 8 sürümüyle  geldi. Neredeyse her Veritabanı yönetim sisteminde ( Oracle, MS SQL Server, MySQL, Sybase, Teradata, DB2 ) bulunan bu özellik ile çok büyük verileri daha kolay bir şekilde yönetebilmekteyiz.

Partitioning teknolojisini genel olarak ifade edersek çok büyük tablolarımızı yada indexlerimizi ayrı ayrı segmentlerde oluşturabilmemize olanak sağlayan bir teknolojidir diyebiliriz. Yani mantıksal olarak bir bütün halinde görünen büyük tablo yada indexleri Partitionlı yapıya dönüştürdüğümüzde daha küçük farklı fiziksel bölümlere ayırabilmekteyiz. Buna ne zaman ihtiyaç duyarız yada hangi durumda Partition kullanmak zorundayım diye soruyorsanız işte size güzel bir iki  örnek vereyim.

Belediyelerin Su Faturalarının tahsilatını yapan veritabanının fatura tablosunu düşünelim. Bu fatura tablosuna her ay müşterilerin ödeyeceği yeni miktarlar yüklenmekte ve bu tablo aynı zamanda mevcut yılın geçmişe dönük aylarının da fatura bilgilerini tutmaktadır. Örneğin, şuanda 2013 yılının haziran ayındayız bu durumda Fatura tablomuzda Mayısta dahil olmak üzere eskiye dönük 5 ayın fatura bilgisi mevcut ve birde haziran ayının faturaları da planlanmış tarihte tabloya yüklenmiş yada yada yüklenecek.  Eğer partitioning teknolojisi olmasaydı yeni ayların faturası yüklendiği zaman veritabanı tüm kayıtları esas alıp ilgili uygun yere yeni kayıtları insert edecekti yada en basitinden şunu düşünelim. Siz mayıs ayına ait faturanızın ne kadar olduğunu sorgulamak istiyorsunuz ve sizin gibi Belediyenin 10 milyon abonesi var. Her bir aboneye ait minimum bir Su aboneliğinin olduğunu düşünsek bile haziran ayına kadar 6 ayda toplam minimum 60 milyon kayıt olacaktır. Dolayısıyla siz mayıs ayına ait faturanızı sorguladığınız zaman eğer fatura tablosu Partitioning yapıda değilse Oracle 60 milyon kayıt içerisinden sizin mayıs ayına ait faturanızı bulup size döndürecektir. Ancak eğer tablonuz aylara göre Partitioning yapıdaysa Oracle ilgili kayıtı sadece Mayıs ayı içerisinde arayacaktır ve  10 milyon kayıt içerisinden sizin kaydınızı bulacaktır. Şimdi soruyorum size 10 milyon kaydın içinden mi 60 milyon kaydın içinden mi 1 kayıdı bulmak daha kolay ve daha hızlıdır ? Tabiki 10 milyon kaydın içinden olacaktır çünkü gereksiz olan 50 milyon kayıt için Oracle diske I/O yapmayacak ve Oracle tüm ayların içerisinden değil sadece ilgili ayın dataları içerisinde sizin aradığınız kaydı bulmaya çalışacaktır.

Yada Şöyle bir örnek daha verelim. Firmanızın Türkiyenin 81 ilindede şubesi bulunmakta ve bu firmanın satışları mantıksal olarak tek bir tabloda tutulmaktadır. Eğer her ile göre bir Partitioning yapılmasaydı yukardaki senaryoların aynısını örnek verirsek Patronunuz sadece Şanlıurfa ya ait satışları ve bu satışların toplam maliyetini öğrenmek istediğinde tüm illerin dataları içerisinden bu veriler bulunup okunacaktı. Ancak illere göre partitioning yaptığınızı düşünürseniz eğer her sorguda istenen illerin verisi bulunduğu ilgili fiziksel dosyadan okunup getirilecektir. Buda haliyle çok daha mantıklı ve daha performanslı bir yöntemdir. Genel itibariyle aşağıdaki durumlarda Bir tabloyu partitioning yapıda oluştururuz yada partitioning olmayan tabloyu partitioning yapıya dönüştürürüz.

  • Tablo yapısında Historical data dediğimiz geçmişe dönük veriler varsa ve bu veriler birbirinden bağımsızsa. Bu tip tablolar daha çok Datawarehouse sistemlerinde vardır ve yukarda anlattığım fatura tablosu gibi geçmiş ayların dataları birbirinden bağımsız olduğu için Partitioning Tablolar Raporlamalarda performans anlamında inanılmaz derecede fark ortaya koymaktadır.
  • Tablo çok büyükse. Bu büyüklük kavramını iyice analiz etmek gerekir. Ör: Benim 7 TB lık bir veritabanımda ben 200-300 GB ve üstü Tabloları listeleyip ilgili bu tabloları Partitioning yapıya uygun olup olmadığını analiz ederim. Çünkü gerekmedikçe Partitioning kullanmakta ekstra ücret gerektirir. ( Partitioning özelliği Oracle Enterprise Edition ile beraber gelmesine rağmen bu özelliği kullandığınız zaman ekstra ücret ödersiniz. )
  • Tabloların arşivlemelerinde çok rahat yönetim ortamı sağlar. Fatura tablosundaki ilk 3 ayın verilerini silmek istediğinizde çok rahatlıkla ilk 3 ayın partitioning ini silerek bu işlemi basit hale getirebilirsiniz. Aksi takdirde Delete komutuyla bu verileri direk silmek hem daha çok zaman hem kötü performans anlamına gelir. Üstelik Delete komutuyla sildikten sonra tablodaki ilgili indexleri Rebuild etmeniz gerekecek ve artan Fragmentation lara karşılık tabloyu shrink etmeniz gerekecektir.
  • Bir Tablonun verileri farklı fiziksel disklerde tutulması gerektiğinde kullanılır. Bu maddeyi şöyle düşünebilirsiniz Fatura Tablonuzun büyüklüğü 5 TB ancak elinizde 5 adet 1 TB lık fiziksel diskler var. İşte böylesi durumlarda partitioning e çok ihtiyaç duyulur bu durumda tablonun verilerini aylara göre Partitioning yapıp her bir partitionı uygun olan disklere yayarız bu performans anlamındada büyük kazanç sağlar.

Oracle da bir tablo üzerinde ihtiyaca göre farklı farklı aşağıdaki Partitioning çeşitlerini kullanabiliriz.

  • Range Partitioning
  • List Partitioning
  • Hash Partitioning
  • Interval Partitioning
  • Composite Partitioning

1- Range Partitioning: En sık kullanılan partitioning yöntemlerinden birisidir. Bu yöntemde veriler belirli Tarih ve sayı aralığına göre ayrılır. Her partition ın alt ve üst sınırı var ve veriler bu aralıkta partitionlara depolanır. Üstte verdiğim Fatura tablosu Range partitioning e örnektir. Range partitioning ile aşağıdaki gibi tablo oluşturulabilir.

SQL> Create table fatura(musteri_id number,
 adi varchar(50),
 soyadi varchar2(50),
 fatura_tarihi date
 )
PARTITION BY RANGE(fatura_tarihi)(
 PARTITION Fatura201301 VALUES LESS THAN(TO_DATE(’01/01/2013',’MM/DD/YYYY’)),
 PARTITION Fatura201302 VALUES LESS THAN(TO_DATE(’01/02/2013',’MM/DD/YYYY’)),
 PARTITION Fatura201303 VALUES LESS THAN(TO_DATE(’01/03/2013',’MM/DD/YYYY’)),
 PARTITION Fatura201304 VALUES LESS THAN(TO_DATE(’01/04/2013',’MM/DD/YYYY’)),
 PARTITION Fatura201305 VALUES LESS THAN(TO_DATE(’01/05/2013',’MM/DD/YYYY’)),
 PARTITION Fatura201306 VALUES LESS THAN(TO_DATE(’01/06/2013',’MM/DD/YYYY’)));

2- List Partitioning: Tablonun ilgili kolonları belirli bir listeye ait verileri içeriyorsa bu tablolarda List partitioning yöntemi kullanılır. Buna en güzel örnek yukarda verdiğim tüm şehirlerde bir şubesi olan Firmanın satışlarının tutulduğu satış tablosudur. Bu yöntemde Range partitioning den sonra en çok kullanılan yöntemlerden birisidir. List partitioning kullanılarak aşağıdaki gibi tablo oluşturulabilir. Aşağıda her bir şehir için bir partition oluşturmak yerine Türkiyenin en büyük 12 şehrinin 3 lü gruplayıp 4 partition oluşturdum. Geriye kalan tüm şehirler ise son partition olan SatisDigerSehirler partitiona dahil olacaktır.

SQL> Create table satis(sehir_id number,
 sehir_adi varchar(50),
 urun_id number,
 urun_fiyati number
 )
PARTITION BY LIST(sehir_adi)(
 PARTITION SatisAnkIstIzm VALUES('Ankara', 'Istanbul','Izmir'),
 PARTITION SatisBurKonAdna VALUES ('Bursa','Konya','Adana'),
 PARTITION SatisUrfDyrGzant VALUES('Şanlıurfa','Diyarbakır','GaziAntep'),
 PARTITION SatisSamErzSiv VALUES('Samsun','Erzurum','Sivas'),
 PARTITION SatisDigerSehirler VALUES(DEFAULT)
 );

3- Hash Partitioning: Bir tablonun kolonları Range veya List partitioning yapmaya uygun değilse eğer bu durumda Hash partitioning kullanılabilir. Örneğin, Vatandaşlık tablosundaki TC Kimlik Numarası kolonu yukardaki hiçbir yönteme uygun değildir bu durumda Hash partitioning kullanılır. Bu yöntemde Oracle internal bir algoritmaya göre gelen dataları ilgili partitionlara aktarır. Bu yöntemde algoritma açık olmadığı için bu partitiona müdahale etmek mümkün değildir.

SQL> Create table Vatandaslik(TC_no number,
 adi varchar(50),
 soyadi varchar2(50)
 )
PARTITION BY HASH(TC_no)
 partitions 4;

4- Interval Partitioning: Bu partitioning yöntemi Oracle 11g ile beraber gelen Range partitioning ile beraber kullanılan yeni bir yöntemdir. Range partitioning yönteminde gelen veri uygun olan partititona ekleniyordu ancak uygun partition bulamadığındaysa ORA-14400 hatasını veriyordu. İşte Interval Partititoning ile artık bu sorun otomatik olarak çözülmektedir. Interval Partitioning ve Range Partitioning in beraber kullanıldığı örnek aşağıdaki gibidir.

SQL> Create table fatura(musteri_id number,
 adi varchar(50),
 soyadi varchar2(50),
 fatura_tarihi date
 )
PARTITION BY RANGE(fatura_tarihi)
 INTERVAL(NUMTOYMINTERVAL(1,'YEAR'))
 STORE IN (DATA01,DATA02,DATA03)
 (
 PARTITION Fatura201301 VALUES LESS THAN(TO_DATE(’01/01/2013',’MM/DD/YYYY’))
 );

5- Composite Partitioning: Bu partitioning yöntemi diğer partitioning yöntemlerinin birleştirilip beraber kullanılması şeklindedir. Bu yöntemle belli bir mantığa göre ayırdığımız dataları ayırdığımız şekliyle tekrar bir kurala göre ayırmadır. Örneğin, Range yöntemine göre ayırdığımız partition verilerini aynı zamanda list ve hash yönteminide ekleyerek Range-List ve Range-Hash partition uygulanabilir. Bu ikisini tek tek aşağıda inceleyelim.

5.a- Range -List Partitioning: Bu yöntem ile yukarda her ikisini ayrı ayrı anlattığım yöntemi birleştireceğim. Mesela Range yönteminde aylara göre ayırdığımız dataları birde list yöntemiyle şehirlere göre sub partition yapalım. Yani Fatura tablomuzu aşağıdaki gibi hem aylara göre partitionlı olarak ayrılırken birde şehirlere göre sub partition yapabiliriz.

Create table faturam(musteri_id number,
 adi varchar(50),
 soyadi varchar2(50),
 sehir_adi varchar2(50),
 fatura_tarihi date
 )
PARTITION BY RANGE(fatura_tarihi)
 SUBPARTITION BY LIST(sehir_adi)
 SUBPARTITION TEMPLATE(
 SUBPARTITION SatisAnkIstIzm VALUES('Ankara', 'Istanbul','Izmir'),
 SUBPARTITION SatisBurKonAdna VALUES ('Bursa','Konya','Adana'),
 SUBPARTITION SatisUrfDyrGzant VALUES('Şanlıurfa','Diyarbakır','GaziAntep'),
 SUBPARTITION SatisSamErzSiv VALUES('Samsun','Erzurum','Sivas')
 )
 (
 PARTITION Fatura201301 VALUES LESS THAN(TO_DATE('01/01/2013','MM/DD/YYYY')),
 PARTITION Fatura201302 VALUES LESS THAN(TO_DATE('01/02/2013','MM/DD/YYYY')),
 PARTITION Fatura201303 VALUES LESS THAN(TO_DATE('01/03/2013','MM/DD/YYYY')),
 PARTITION Fatura201304 VALUES LESS THAN(TO_DATE('01/04/2013','MM/DD/YYYY')),
 PARTITION Fatura201305 VALUES LESS THAN(TO_DATE('01/05/2013','MM/DD/YYYY')),
 PARTITION Fatura201306 VALUES LESS THAN(TO_DATE('01/06/2013','MM/DD/YYYY')));

5.b- Range-Hash Partitioning: Bu yöntemde de Range yöntemiyle partitiona ayrılan veriler ayrıca birde hash lenerek sub partition lara ayrılabilir. Aşağıdaki örnekte fatura tablosunu range yöntemiyle partitiona ayırdıktan sonra ayrılan her bir partitioıda musteri_id kolonuna göre hash yöntemiyle sub partition yapabiliriz.

SQL> Create table fatura(musteri_id number,
 adi varchar(50),
 soyadi varchar2(50),
 sehir_adi varchar2(50),
 fatura_tarihi date
 )
PARTITION BY RANGE(fatura_tarihi)
 SUBPARTITION BY HASH(musteri_id)
 SUBPARTITION TEMPLATE(
 SUBPARTITION PART1 Tablespace DATA01,
 SUBPARTITION PART2 Tablespace DATA02,
 SUBPARTITION PART3 Tablespace DATA03)
 (
 PARTITION Fatura201301 VALUES LESS THAN(TO_DATE(’01/01/2013',’MM/DD/YYYY’)),
 PARTITION Fatura201302 VALUES LESS THAN(TO_DATE(’01/02/2013',’MM/DD/YYYY’)),
 PARTITION Fatura201303 VALUES LESS THAN(TO_DATE(’01/03/2013',’MM/DD/YYYY’)),
 PARTITION Fatura201304 VALUES LESS THAN(TO_DATE(’01/04/2013',’MM/DD/YYYY’)),
 PARTITION Fatura201305 VALUES LESS THAN(TO_DATE(’01/05/2013',’MM/DD/YYYY’)),
 PARTITION Fatura201306 VALUES LESS THAN(TO_DATE(’01/06/2013',’MM/DD/YYYY’)));

Composite partitioning yöntemiyle yukarda belirtilen yöntemler dışında aşağıdaki yöntemlerde birleşerek Composite partitioning yapılabilir. Ben en çok kullanılanları yukarda anlattım bunun dışındakiler ise aşağıdaki gibidir.

  • Range-range partitioning
  • List-range partitioning
  • List-hash partitioning
  • List-list partitioning
  • Interval-range partitioning
  • Interval-list partitioning
  • Interval-hash partitioning
  • Hash-hash partitioning

Böylece bu yazımın daha sonuna gelmiş bulunmaktayım bir sonraki yazıda görüşmek dileğiyle esen kalın..

Reklamlar

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Connecting to %s