Tekrar Merhaba,
Oracle 11g ile gelen ve partition tablolar için kullanılan yeni bir özellikten bahsetmek istiyorum.Interval partitioning
range partition tipinde oluşturulan tablolarda otomatik olarak yeni partitionların yaratılmasını sağlar.
Interval partitioning i biz sadece range partitionlarda kullanabiliriz,partition tek kolondan oluşmalı ve tipi number veya date olmalıdır.
Interval partitioning de otomatik olarak yeni partitiionlar yaratılacağı için maxvalue değeri kullanılmaz.
Partition aralığında belirtilen aralıktan farklı değer girildiği takdirde zaten yeni bir partition yaratılacağı için maxvalue kullanılması anlamsız olur.Ayrıca interval partition özelliğini Index Organized Table larda kullanamayız.
Şimdi bir örnek yapalım,
create table part_test
(personel_adi varchar2(30),ise_baslama_tarihi date)
partition by range(ise_baslama_tarihi)
interval(numtoyminterval(1,'YEAR'))
(partition p1 values less than ((TO_DATE(' 2008-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))))
select partition_name,high_value from user_tab_partitions where table_name='PART_TEST';
SQL> select partition_name,high_value from user_tab_partitions where table_name='PART_TEST';
PARTITION_NAME HIGH_VALUE
------------------------------ ---------------------------------------------------------------------
P1 TO_DATE(' 2008-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
Tablomuz şuan tek partitiondan oluşuyor ve yeni bir yıl aralığı için yeni partition ı otomatik oluşturabilecek.
Deneyelim,
SQL> insert into part_test values ('IŞIL','01.05.2008');
1 row created.
Şimdi tekrar partitionları görelim,
SQL> select partition_name,high_value from user_tab_partitions where table_name='PART_TEST';
PARTITION_NAME HIGH_VALUE
------------------------------ ---------------------------------------------------------------------
P1 TO_DATE(' 2008-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
SYS_P181 TO_DATE(' 2009-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
Görüldüğü gibi yeni partition ımız SYS_P181 adında otomatik olarak oluştu.
Eğer varolan bir partition tablonuzu interval partition işlemi ile otomatik partitionlama yapmak istiyorsanız,
SQL> alter table part_test SET INTERVAL (NUMTOYMINTERVAL(1,'YEAR'));
Komutu ile bu işlemi yapabilirsiniz.Bu durumda mevcut tablonuzda maxvalue değeri ile yaratılan bir partition varsa tabloyu interval olarak set ederken hata alırsınız.Bu durumda maxvalue içeren partition ı split komutu ile bölup maxvalue değerli partitionı düşürmeniz ve daha sonra interval olarak set etmemiz gerekiyor.
Bununla ilgilide hemen bir örnek yapalım,
create table part_test2
(personel_adi varchar2(30),ise_baslama_tarihi date)
partition by range(ise_baslama_tarihi)
(partition p1 values less than ((TO_DATE(' 2008-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))),
partition p2 values less than (MAXVALUE)) ;
SQL> insert into part_test2 select * from part_test;
1 row created.
SQL> commit;
Commit complete.
SQL> select * from part_test2 partition(p2);
PERSONEL_ADI ISE_BASLAM
------------------------------ ----------
IŞIL 01/05/2008
Şuan maxvalue değeri ile yaratılmış partitionda datamız var,Interval olarak set ettiğimizde,
SQL> alter table part_test2 SET INTERVAL (NUMTOYMINTERVAL(1,'YEAR'));
alter table part_test2 SET INTERVAL (NUMTOYMINTERVAL(1,'YEAR'))
*
ERROR at line 1:
ORA-14759: SET INTERVAL bu tabloda geçerli değil.
Şeklinde bir hata alırız.Bu durumda split yapıp maxvalue değerli partitionda datamız kalmadığına emin olduktan sonra bu partition ı düşürmemiz gerekiyor,
SQL> alter table part_test2 split partition P2 at (TO_DATE(' 2009-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) into (partition P2, partition P3);
Table altered.
SQL> select * from part_test2 partition(p2);
PERSONEL_ADI ISE_BASLAM
------------------------------ ----------
IŞIL 01/05/2008
SQL> select * from part_test2 partition(p3);
no rows selected
SQL> select partition_name,high_value from user_tab_partitions where table_name='PART_TEST2';
PARTITION_NAME HIGH_VALUE
------------------------------ ---------------------------------------------------------------------
P1 TO_DATE(' 2008-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
P2 TO_DATE(' 2009-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
P3 MAXVALUE
Görüldüğü gibi artık p3 partitionımızın high_value değeri maxvalue ve bu partition da şuan hiç datamız yok,bu durumda partition ı drop ettikten sonra partition tablomuzu interval olarak set edebiliriz.
SQL> alter table part_test2 drop partition p3;
Table altered.
SQL> alter table part_test2 SET INTERVAL (NUMTOYMINTERVAL(1,'YEAR'));
Table altered.
SQL> select partition_name,high_value from user_tab_partitions where table_name='PART_TEST2';
PARTITION_NAME HIGH_VALUE
------------------------------ ---------------------------------------------------------------------
P1 TO_DATE(' 2008-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
P2 TO_DATE(' 2009-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')
SQL> insert into part_test2 values ('AHMET','01.01.2009');
1 row created.
SQL> commit;
Commit complete.
SQL> select partition_name,high_value from user_tab_partitions where table_name='PART_TEST2';
PARTITION_NAME HIGH_VALUE
------------------------------ ---------------------------------------------------------------------
P1 TO_DATE(' 2008-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA')
P2 TO_DATE(' 2009-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA')
SYS_P201 TO_DATE(' 2010-01-01 00:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIA')
Not:Partition tablomuzda partitionları böldükten sonra indexlerimizi kontrol etmeyi unutmayalım.Indexler unusable olmuş olabilir.Rebuild işlemi gerektirebilir.
Teşekkürler...
Hiç yorum yok:
Yorum Gönder