System Partitioning …

System partitioning şimdiye kadar benim hiç kullanmadığım ve 11g ile birlikte gelen yeni bir özellik, öncesinde özetle ne olduğundan bahsedelim, sonrasında kullanılması durumunda ne gibi avantajları olduğu üzerinde konuşuruz.

System partitioning data’ nın tablespace’lere yerleşiminde, veritabanını kontrolü olmadan tamamen uygulamanın kontrolünde datanın dağıtılmasını sağlar. Bu işlemi çok basitçe şöyle anlatabiliriz, database sadece tablonun partitionlara ayrılmasında yardımcı oluyor ama datanın hangi partitiona gideceğini bilmiyor ve dolayısıyla da yönetmiyor, bu kısım sadece uygulamanın kontrolünde gerçekleşiyor. Bu işlemin gerçekleşmesi içinde parititoning’in tümüyle uygulama tarafından kontrol edilmesi gereksinimini doğuruyor. Yani system partitioning yapılmış olan bir tabloya bir kayıt insert etmeye çalışıldığında eğer insert statementı içerisinde hangi partitiona insert edileceği açıkca belirtilmediği süre insert işlemi hata alacaktır.

Ne demek istediğimizi bir örnekle açıklayalım ;

Öncelikle system partitioning özelliği kullanılarak tablomuzu create edelim;

CREATE TABLE Sys_Part_Table (a number, b number)
PARTITION BY SYSTEM
(
PARTITION p1 TABLESPACE tbs1,
PARTITION p2 TABLESPACE tbs2,
PARTITION p3 TABLESPACE tbs3,
PARTITION p4 TABLESPACE tbs4,
PARTITION p5 TABLESPACE tbs5
);
Table created.

Şimdi tablomuzu aşağıdaki gibi basit bir insert scripti ile data insert etmeye çalışalım ;

SQL> INSERT INTO Sys_Part_Table values (1,2)
INSERT INTO Sys_Part_Table values (1,2)
Error at line 1
ORA-14701: partition-extended name or bind variable must be used for DMLs on tables partitioned by the System method
Script Terminated on line 333.

Hata aldık, en başından dediğimiz gibi tablomuz system partitiong kullanılarak partitioning yapılmış bir tablo idi. Dolayısıyla datanase’ in manage etmedeği bir yapıya sahip, uygulama tarafında siz insert edeceğiniz kaydın hangi partitiona gideceğini belirtmediğiniz sürece hata alırsınız, peki nasıl adresleyeceğiz;

SQL> INSERT INTO Sys_Part_Table partition (p1) values (1,2)
1 row created.
SQL> INSERT INTO Sys_Part_Table partition (p2) values (3,4)
1 row created.
SQL> INSERT INTO Sys_Part_Table partition (p3) values (4,5)
1 row created.
SQL> INSERT INTO Sys_Part_Table partition (p4) values (5,6)
1 row created.
SQL> INSERT INTO Sys_Part_Table partition (p5) values (7,8)
1 row created.

Her partition için bir örnek bir insert yapmış olduk. Eğer system partitioning kullanıyor iseniz insert scriptlerinizde mutlaka partition key word’ ünü mutlaka kullanacaksınız demektir.

Burada akıllara şöyle bir soru gelebilir, insert ederken kaydın nerede saklanacağını belirtiyorken benzer veya aynı işlemi delete veya update yaparken de kullanmak zorundamıyım ? Cevap Hayır, system partitioning farkı insert işlemlerinde kendini gösteriyor diğer tüm DML işlemleri diğer tablolarda nasılsa burada aynı şekilde yapılmaktadır. Aşağıda bununla ilgili bikaç örnek bulabilirsiniz.

SQL> delete from Sys_Part_Table
5 rows deleted.

SQL> delete from Sys_Part_Table where a = 1
1 row deleted.

SQL> update Sys_Part_Table set a=10
5 rows updated.

SQL> update Sys_Part_Table set a=10 where b=2
1 row updated.

Yukarıdaki işlemleri bu şekilde yapabileceğiniz gibi partition isimlerini kullanarakda yapabilirsiniz, örneğin;

SQL> delete from Sys_Part_Table partition (p1) where a = 1
1 row deleted.

Oracle system paritioning kullanıyorsanız tüm DML işlemlerinde partition name kullanarak yapmanızı önerir. Ancak bu zorunluluk arzetmez.

System partitioning kullanmamız durumundaki kısıtlarımızdan biraz bahsedelim ;

• Partitioning maintance komutları ile diğer tüm DDL komutlarını system partitioning kullanılarak oluşturulmuş object’ lerde de kullanabilirsiniz. Sadece aşağıdaki komutları burada kullanarak system partitioning oluşturamazsınız ;

ALTER INDEX SPLIT PARTITION,
ALTER TABLE SPLIT PARTITION,
CREATE TABLE (as SELECT)

• Local index create edebilirsiniz, ancak partition key’ ihtiyaç duyacağı için unique local index create edemezsiniz.

Create local index;

CREATE INDEX KAMIL.ind_1 ON KAMIL.SYS_PART_TABLE
(A)
LOGGING
LOCAL (
PARTITION P1
NOCOMPRESS ,
PARTITION P2
NOCOMPRESS ,
PARTITION P3
NOCOMPRESS ,
PARTITION P4
NOCOMPRESS ,
PARTITION P5
NOCOMPRESS
)
NOPARALLEL;
Index created.

Create unique local index ;

CREATE UNIQUE INDEX KAMIL.ind_1 ON KAMIL.SYS_PART_TABLE
(A)
LOGGING
LOCAL (
PARTITION P1
NOCOMPRESS ,
PARTITION P2
NOCOMPRESS ,
PARTITION P3
NOCOMPRESS ,
PARTITION P4
NOCOMPRESS ,
PARTITION P5
NOCOMPRESS
)
NOPARALLEL
Error at line 1
ORA-14184: cannot create an UNIQUE partitioned index on a SYSTEM partitioned table

• Local bitmap indexler kullanabilirsiniz.

• Global indexler kullanabilirsiniz.

• Tüm DML işlemlerinizi yapabilirsiniz.

• Insert as select işlemini bu şekilde kullanamazsınız, (partition name’ ini belirtmediğiniz için)

SQL> insert into SYS_PART_TABLE select * from SYS_PART_TABLE2
insert into SYS_PART_TABLE select * from SYS_PART_TABLE2
Error at line 1
ORA-14701: partition-extended name or bind variable must be used for DMLs on tables partitioned by the System method

Ancak aşağıdaki gibi kullanabilirsiniz;

INSERT INTO SYS_PART_TABLE PARTITION (p1) select * from SYS_PART_TABLE2
8 rows created.

System partitioning kullanımına bence çok iyi düşünülerek kara verilmesi gereken bir konudur, aslında tablo uygulama içerisinden manage(!) edileceği için yazılımcı ile birlikte çalışılması gereken bir konudur.
Kullanmak isteyenler veya kullanmayı düşünenler için umarım faydalı olmuştur.

Be Sociable, Share!

3 comments

  1. Yazının içerisinde aslında ufak ufak sinyallerini vermeye çalışmıştım bende, benimde şimdiye kadar hiç kullanmadığım kullanmayı da pek düşünmeyeceğim bir özellik ama itiraf etmeliyim ki bu konuda senin kadar dürüst olamamıştım :)

    • Merhabalar,
      11g ile gelen bu özelliği okumuştum. Sizlere %100 katılıyorum. Yazılımcı arkadaşlar yeterince performans problemleri yaratabiliyorlar. Bu nedenle ekstra iş yükü yaratmaya gerek yok diye düşünüyorum. Ki planlamayı uygulamaya vermek çok ta tercih ettiğim bir yöntem değil.
      Paylaşım için teşekkürler.

  2. Kamil, güzel bir yazı olmuş. Ben böyle bir özelliğin olduğunun farkında bile değildim. Ama kullanır mısın denen kesinlikle kullanmam. Açıkçası verinin partitionlara dağılımını uygulamayı yazanlara bırakmak bana akıl kârı gelmiyor. Çünkü sonrasında o partitionlarla mücadele edecek olan biz DBA’ler olacağız :)

Kamil Türkyılmaz için bir cevap yazın Cevabı iptal et

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir


bir + = 2

Şu HTML etiketlerini ve özelliklerini kullanabilirsiniz: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">