Oracle Partitioning …

Merhabalar, yine uzun zamandır yazmayı planladığım konulardan biri oracle’ da partitioning kavramı nedir, nasıl yapılır, çeşitleri nelerdir, avatajları ve dezavantajları nelerdir, hangi partitining metodu hangi durumda kullanılmalıdır gibi bazı temel sorulara cevap vermeye çalışacağım.

Öncesinde birkaç gün önce karşılaştığım bir problem den bahsetmek istiyorum. Aix üzerinde çalışan 10g database’ lerimizden birini geçen hafta işletim sistemi SLES11 olacak şekilde 11.2.0.2 upgrade ettik. Upgrade sonrasında clob kolon içeren bir tablo üzerinde yoğun xml file yazım işlemi yapıldığından dolayı bu tablodan kaynaklı çok fazla “enq: HW – contention” eventları oluşuyordu. Yine bir takım zorunluluklardan dolayı aynı anda OS değişikliği, oracle versiyon değişikliği ve Was tarafında kullanılan uygulamanın was6’ dan was7 ye upgrade edilmesi gibi birçok değişikliğin aynı anda yapılıyor olması sorunun tespitinde bir takım zorluklarıda beraberinde getirmişti. Sonrasında talihsizlik o ki, sunucu üzerindeki disklerin konfigurasyonu ile yapılan bir hata, yine sunucu üzerinde ODM (Oracle Disk Manager) kullanımın getirmiş olduğu bir takım farklılıklar, yapılan kampanyalar sonrasında tablonun üzerindeki transaction sayılarındaki ciddi artış, yazılan xml file’ larının öncesindeki ve sonrasındaki size farklılıkları gibi nedenlerden sorunun adını koymak veya net bir teşhişde bulunmak çok kolay olmadı. Asıl zorluk production bir sistem üzerinde çalışıyorsunuz ve yaptığınız bir değişikliğin sonucunu öncesinde test etmek şansınız olmuyor sonrasında değişikliği geri almak veya farklı bir seçenekle devam etmek için kesinti almanız gerekebiliyor, bunun için arka tarafda bir sürü procedore işletmeniz gerekiyor vs… Netice olarak sorunu tabloyu Hash partitioning yaparak 12 parçaya böldükden sonrasında performans probleminden eser kalmadı.

Partitioning, sadece çok büyük veritabanlarında değil, zaman zaman daha küçük olan veritabanlarında da ciddi performans kazançları sağlayabilmektedir.

Peki ne zaman bir tablo partition yapılmalıdır? Bununla ilgili oracle’ ın yol gösterici olması için bir takım önerileri bulunmaktadır;

• Size’ i 2 gb’ dan büyük olan tablolar paritition tablolar için aday olarak düşünülebilirler,

• Historical data içeren tablolar ve yeni eklenen kayıtlar en son partitiona ekleniyorsa partition yapılabilir demektir. Örneğin, tablomuzu yılın 12 ayına göre partitionladığımızı varsayalım. Yeni eklenen kayıtlar sadece en son aya geliyorsa ve diğer aylar üzerinde de sadece read yapılıyorsa, bu tablo partition için uygun demektir,

• Bir tablonun içeriği storage device’ ları arasında farklı device’ lara dağıtılması gerektiğinde partitioning kullanılabilinir,

• Son olarak ben de bir madde eklemek istiyorum, eğer production ortamınız da hızlı büyüyen bir tablonuz var ise ve bu tablodaki kayıtların zaman zaman arşivlemeniz gerekiyorsa partitioning’ i mutlaka kullanmanızı öneririm. Arşivleme sonrasında production daki veriyi delete ile silmeniz size direkt olarak bir kazanç sağlamayacaktır. Sonrasında shrink ve indexleride rebuild etmeniz gerekecektir. Veya data data işlemini sonrasında veriyi silip exp –imp ile tekrar productiona taşımanız gerekecektir. Ancak partitioning kullandığınızda, örneğin en eski parititioning’ i taşıyıp sonrasında da sadece bu parçayı drop edebilirsiniz.

Aynı soruyu indexler için sorarasak, Ne zaman index partitioning kullanılabilir;

• Tablodaki data silindiğinde tüm indexi rebuild etmemek için kullanılabilir,
• Tüm indexi invalid etmeden daha küçük parçalar üzerinde işlem yapabilmek için,
• Bir sutun üzerindeki değerin monoton artan bir yapıya sahip olması durumunda, bu durumun indexler üzerindeki etkisini azaltmak için,

partitioning yapılabilmektedir.

Partitioning ve LOB Data

Veritabanın da yapılandırılmamış veriler (örneğin resim veya dökümanlar) partitionlanmış olan LOB columnlarda saklanabilirler. Tablo eğer partitionlanmışsa, tüm kolonlar kendi partitionlarının ait oldukları tablespace’ lerde tutulurlar, ancak LOB segmentler kendi içinde depolanabilirler.

Eğer bir tablo çok büyük loblardan oluşuyorsa bu teknik son derece faydalı olacaktır çünkü bu lob data ayrı ayrı saklanılabilir. Tabi burada ana veri sık sık güncellenebilir ancak LOB datanın update görmediğini varsayıyoruz. (Örneğin bir çalışana ait adres, department bilgisi sık sık değişebilir ancak resmi değişmeyecektir.)

Partitioning Yöntemini Kullanarak Disk I/O Probleminden Kaçınmak

Çok büyük tablolar üzerindeki performans problemlerinin önüne geçmekteki en iyi yöntemi partitioning kullanmakdır. Partitioning ile daha küçük tablo parçalarına erişim sağlandığından dolayı tabloya full yada index ile erişim sağlamakdan daha verimlidir. Eğer tablo parçaları farklı devicelarda store edilirse, disk çıktısı fazlasıyla artacaktır. Partitioning yaoılmış olan tablo üzerinden backup almak istediğimizde her partition table diğerlerinden bağımsız olarak backup sürecine dahil olacağından potansiyel disk I/O yoğunluda düşecektir. Bir örnekle açıklayalım ;
departmant adında bir tablomuz olsun, bu tablomuzuda aşağıdaki şekilde partitionlayalım.

SQL> create table department
(deptno number,
dept_name varchar2(50))
partition by range (deptno)
(partition deptno1 values less than (10) tablespace tbs1,
partition deptno2 values less than (20) tablespace tbs2,
partition deptno3 values less than (maxvalue) tablespace tbs3)
Table created.

Sample data oluşturalım ;

SQL> insert into department values (1,’IT’)
1 row created.
SQL> insert into department values (8,’IK’)
1 row created.
SQL> insert into department values (10,’SA’)
1 row created.
SQL> insert into department values (15,’IS’)
1 row created.
SQL> insert into department values (20,’YM’)
1 row created.
SQL> insert into department values (25,’OED’)
1 row created.
SQL> insert into department values (30,’MH’)
1 row created.
SQL> insert into department values (12,’DT’)
1 row created.
SQL> commit
Commit complete.

Department tablosunu 3 farklı partition olacak şekilde oluşturduk. Ve her bir parçayı da farklı disklerde saklayacak şekilde set ettik. Dolayısıyla her bir data için farklı disklerden okuma yapacağı için disk üzerindeki i/o yoğunluğuda azalmış oldu.

Tablodaki dataları select etmeye çalışalım ;

SQL> select * from department

DEPTNO DEPT_NAME
———- ————————————————–
1 IT
8 IK
10 SA
15 IS
12 DT
20 YM
25 OED
30 MH

8 rows selected.

SQL> select * from department partition (deptno1)

DEPTNO DEPT_NAME
———- ————————————————–
1 IT
8 IK

2 rows selected.

SQL> select * from department partition (deptno2)

DEPTNO DEPT_NAME
———- ————————————————–
10 SA
15 IS
12 DT

3 rows selected.

SQL> select * from department partition (deptno3)

DEPTNO DEPT_NAME
———- ————————————————–
20 YM
25 OED
30 MH

3 rows selected.

Partitioning Çeşitleri ;

İki grupda inceleyebiliriz;

1. Single – Level Partitioning
1.1 Range Partitioning
1.2 Hash Partitioning
1.3 List Partitioning
2. Composite Partitioning
2.1 Composite Range-Range Partitioning
2.2 Composite Range-Hash Partitioning
2.3 Composite Range-List Partitioning
2.4 Composite List-Range Partitioning
2.5 Composite List-Hash Partitioning
2.6 Composite List-List Partitioning

Sırayla detaylarından bahsetmeye çalışalım.

Range Partitioning ;
Range partitioning genellikle zaman bazında bir dağılım/parçalama yapılmak istendiğinde kullanılan bir yöntemdir. Partition key olarak belirtilen alandaki değerler istenilen aralıklar bazında partitionlanarak oluşturulur. Range partition yapılırken birden fazla kolon da kullanabilirsiniz. Her bir partition “values less than clause” unı içerir. Tabloya eklenecek olan herhangi bir değer, bu aralığa eşit yadan yüksek olması durumunda bir üst bölüme eklenecektir. Max Value değeri en son (en yüksek) partition için tanımlanır. Belirtilen aralığın üzerindeki tüm değerler ile Null değerleri içerektir.

Örnek bir create scripti ;
SQL> create table cust_sales
(act_no number,
cust_name varchar(50),
item_id number,
sale_day integer not null,
sale_month integer not null,
sale_yr integer not null )
partition by range (sale_yr, sale_month,sale_day)
(partition cust_sales_q1 values less than (2010,01,01) tablespace tbs5,
partition cust_sales_q2 values less than (2010,10,01) tablespace tbs6,
partition cust_sales_q3 values less than (2011,06,01) tablespace tbs7,
partition cust_sales_q4 values less than (2012,01,01) tablespace tbs8,
partition cust_sales_q5 values less than (maxvalue,maxvalue,maxvalue) tablespace tbs5)
Table created.

Hash Partitioning ;
Belirlenmiş olan partition key üzerinden Oracle’ ın hash algoritması sayesinde datalar bu algoritma sonucuna göre partitionlanacaklardır. Range ve list partitiong’ in kullanılamadığı yani belirli bir tarih veya aralık içermeyen tablolarda dağılım yapılırken baz alınabilecek bir kolon üzerinden oracle hash algortimasını kullanarak tabloları istediğimiz şekilde partitionlayacaktır.

Hash paritioning, device’ lar arasında verileri dağıtmak için ideal bir yöntemdir. Hash patitioning range partitioning’ in bir alternatividir ayrıca buradaki data burada bir historical veri değildir.

Dikkat edilmesi gereken bir nokta, hash partitioning kullanıyorsanız eğer, sonradan hash algoritmasını asla değiştiremezsiniz. Ayrıca, hash partitioning kullanıyorsanız, partitionları ayırma, drop etme ve merge etme gibi işlemleri yapamazsınız. Sadece bazı partitionları birleştirebilirsiniz.

Örnek bir create scripti ;
SQL> create table cust_sales_hash
(acct_no number,
cust_name varchar2(50),
sale_day integer not null,
sale_month integer not null,
sale_year integer not null)
partition by hash (acct_no)
partitions 4
store in (tbs1, tbs2,tbs3,tbs4)
Table created.

Tablo create ederken partition gruplarınıza isim vermezseniz, partition name’ lerinzi oracle belirleyecektir.

List Partitioning ;
List partitioning, önceden belirlenmiş olan bir kritere göre dataların nasıl dağıtılacağının belirlendiği yöntemdir. List partitioning’ in avantajı sırasız ve doğal bir şekilde veri setlerini gruplayabilir ve organiz edilebiliyor olmasıdır.

List paritioning kullanmanın bazı kısıtları vardır. Bunlar ;

• Sadece bir tane partition key tanımlayabilirsiniz ve buda LOB kolon olamaz.
• Her bir partition değeri, VALUES clause’ unda unique olarak olmalıdır. (tablodaki tüm partitionlar arasında)
• İndex-organized tablolara list partition tanımlanamaz.
• Her bir partition’ ın değer listesini içeren string 4K kadar olabilir.
• Toplam partitionların sayısının değeri 64K-1’ I geçemez.

Örnek bir create scripti ;
SQL> create table dept
(dept_no number,
dname varchar2(20),
loc varchar2(20))
partition by list (dname)
( partition d1_birinci_bolge values (‘ISTANBUL’,’ANKARA’) ,
partition d2_ikinci_bolge values (‘IZMIR’,’KONYA’,’ADANA’),
partition d3_ucuncu_bolge values (‘TOKAT’,’ERZINCAN’))
Table created.

Bu üç yöntemi birlikte aşağıdaki grafikde de görebilirsiniz.

Composite Partitioning

Single-level partitioning kullanılmasına ek olarak bir alt seviyede ikinvi bir veri dağıtım yönteminin kullanılmasıyla oluşturulan bir partitioning yöntemidir. Dolayısıyla isimlendirmelerden anlaşılacağı üzere sırayla data iki seviyede gruplandırılmaktadır. Buradaki her bir gruplandırma seviyesi istenirse farklı disklerde store  edilebilir.

Composite Range-Range Partitioning
İki boyutta mantıksal aralığı bölümlemenizi sağlar. Örneğin, order_date bazında partitioning yapıp subpartition olarak da shipping_date’ i kullanılabilir.

Örnek bir create scripti ;
CREATE TABLE table_range_range (
cust_id NUMBER(10),
cust_name VARCHAR2(25),
cust_state VARCHAR2(2),
time_id DATE)
PARTITION BY RANGE(time_id)
SUBPARTITION BY RANGE (cust_id)
SUBPARTITION TEMPLATE(
SUBPARTITION original VALUES LESS THAN (1001) TABLESPACE tbs1,
SUBPARTITION acquired VALUES LESS THAN (8001) TABLESPACE tbs2,
SUBPARTITION recent VALUES LESS THAN (MAXVALUE) TABLESPACE tbs3) (
PARTITION per1 VALUES LESS THAN (TO_DATE(’01/01/2000′,’DD/MM/YYYY’)),
PARTITION per2 VALUES LESS THAN (TO_DATE(’01/01/2005′,’DD/MM/YYYY’)),
PARTITION per3 VALUES LESS THAN (TO_DATE(’01/01/2010′,’DD/MM/YYYY’)),
PARTITION future VALUES LESS THAN (MAXVALUE));
Table created.

Composite Range-Hash Partitioning
Burada range metoduna göre partitioning, bir alt seviyede ise hashing yöntemine göre subpartitioning yapılır. Composit range-hash partitioning, gelişmiş tönetilebilirlik, datanın yerleştirilmesi ve paralellizm gibi alanlarda avantaj sağlamaktadır.

Örnek bir create scripti ;
CREATE TABLE comp_rang_hash (
cust_id NUMBER(10),
cust_name VARCHAR2(25),
amount_sold NUMBER(10,2),
time_id DATE)
PARTITION BY RANGE(time_id)
SUBPARTITION BY HASH(cust_id)
SUBPARTITION TEMPLATE(
SUBPARTITION sp1 TABLESPACE tbs5,
SUBPARTITION sp2 TABLESPACE tbs6,
SUBPARTITION sp3 TABLESPACE tbs7,
SUBPARTITION sp4 TABLESPACE tbs8) (
PARTITION sales_pre05
VALUES LESS THAN (TO_DATE(’01/01/2005′,’DD/MM/YYYY’)),
PARTITION sales_2005
VALUES LESS THAN(TO_DATE(’01/01/2006′,’DD/MM/YYYY’)),
PARTITION sales_2006
VALUES LESS THAN(TO_DATE(’01/01/2007′,’DD/MM/YYYY’)),
PARTITION sales_2007
VALUES LESS THAN(TO_DATE(’01/01/2008′,’DD/MM/YYYY’)),
PARTITION sales_2008
VALUES LESS THAN(TO_DATE(’01/01/2009′,’DD/MM/YYYY’)),
PARTITION sales_future
VALUES LESS THAN(MAXVALUE));
Table created.

Composite Range-List Partitioning
Range metoduna göre partitioning, bir alt seviyede ise list yöntemine göre subpartitioning yapılır.

Örnek bir create scripti ;
CREATE TABLE composite_rng_list (
cust_id NUMBER(10),
cust_name VARCHAR2(25),
cust_state VARCHAR2(2),
time_id DATE)
PARTITION BY RANGE(time_id)
SUBPARTITION BY LIST (cust_state)
SUBPARTITION TEMPLATE(
SUBPARTITION west VALUES (‘OR’, ‘WA’) TABLESPACE tbs1,
SUBPARTITION east VALUES (‘NY’, ‘CT’) TABLESPACE tbs2,
SUBPARTITION cent VALUES (‘OK’, ‘TX’) TABLESPACE tbs3) (
PARTITION per1 VALUES LESS THAN (TO_DATE(’01/01/2000′,’DD/MM/YYYY’)),
PARTITION per2 VALUES LESS THAN (TO_DATE(’01/01/2005′,’DD/MM/YYYY’)),
PARTITION per3 VALUES LESS THAN (TO_DATE(’01/01/2010′,’DD/MM/YYYY’)),
PARTITION future VALUES LESS THAN(MAXVALUE));
Table created.

Composite List-Range Partitioning
List partitioning metoduna göre partitioning, bir alt seviyede ise range yöntemine göre subpartitioning yapılır.

Örnek bir create scripti ;
CREATE TABLE composite_list_rng (
cust_id NUMBER(10),
cust_name VARCHAR2(25),
cust_state VARCHAR2(2),
time_id DATE)
PARTITION BY LIST(cust_state)
SUBPARTITION BY RANGE (cust_id)
SUBPARTITION TEMPLATE(
SUBPARTITION original VALUES LESS THAN (1001) TABLESPACE tbs1,
SUBPARTITION acquired VALUES LESS THAN (8001) TABLESPACE tbs2,
SUBPARTITION recent VALUES LESS THAN (MAXVALUE) TABLESPACE tbs3) (
PARTITION west VALUES (‘OR’, ‘WA’),
PARTITION east VALUES (‘NY’, ‘CT’),
PARTITION cent VALUES (‘IL’, ‘MN’));
Table created.

Composite List-Hash Partitioning
List partitioning metoduna göre partitioning, bir alt seviyede ise hash yöntemine göre subpartitioning yapılır.

Örnek bir create scripti ;
CREATE TABLE composite_list_hash (
cust_id NUMBER(10),
cust_name VARCHAR2(25),
cust_state VARCHAR2(2),
time_id DATE)
PARTITION BY LIST(cust_state)
SUBPARTITION BY HASH (cust_id)
SUBPARTITION TEMPLATE(
SUBPARTITION sp1 TABLESPACE tbs1,
SUBPARTITION sp2 TABLESPACE tbs2,
SUBPARTITION sp3 TABLESPACE tbs3,
SUBPARTITION sp4 TABLESPACE tbs4) (
PARTITION west VALUES (‘OR’, ‘WA’),
PARTITION east VALUES (‘NY’, ‘CT’),
PARTITION cent VALUES (‘IL’, ‘MN’));
Table created.

Composite List-List Partitioning
Composite list-list partitioning enables logical list partitioning along two dimensions; for example, list partition by country_id and list subpartition by sales_channel.

Örnek bir create scripti ;
CREATE TABLE composite_list_list (
cust_id NUMBER(10),
cust_name VARCHAR2(25),
cust_state VARCHAR2(2),
time_id DATE)
PARTITION BY LIST(cust_state)
SUBPARTITION BY LIST (cust_id)
SUBPARTITION TEMPLATE(
SUBPARTITION beg VALUES (1,3,5) TABLESPACE tbs1,
SUBPARTITION mid VALUES (2,4,6) TABLESPACE tbs2,
SUBPARTITION end VALUES (7,8,9,0) TABLESPACE tbs3) (
PARTITION west VALUES (‘OR’, ‘WA’),
PARTITION east VALUES (‘NY’, ‘CT’),
PARTITION cent VALUES (‘IL’, ‘MN’));
Table created.

İndex Partitioning ;

Partition tablomuzu oluşturduğumuzu varsayarsak, bu partitionlu tablolar üzerine nasıl ve ne tür index oluşturacağımızdan biraz bahsetmek istiyorum.

Partitionlı tablolar gibi, partition yapılmış indexlerde yönetilebilirlik, kullanılabilirlik, performans ve ölçeklenebilirlik açısından geliştirici bir etkiye sahiptir.

İndexleri ya partitiondan bağımsız olarak (global indexler) oluşturabilir veya atomatik olarak sadece partitionlu alanlar üzerinde (local indexler) indexler oluşturabilirsiniz. Genel kullanım mantığına baktığımızda eğer OLTP sistemler üzerinde çalışıyorsanız yoğunlukla global index, eğer datawarehouse sistemler üzerinde çalışıyor iseniz local indexler yoğunlukla kullanılmaktadır. Ancak yönetimi bakımından eğer yapabiliyorsanız OLTP sistemlerde de local indexleri kullanabilirsiniz.

Global index, local index diye bir takım index türlerinden bahsettik.Buradaki bir diğer önemli soru şu aslında; BU index türlerinden hangisini kullanacağıma nasıl karar vermeliyim. Bu konudada oracle’ ın bir takım önerileri var;

• Eğer tablo partitionladığınız kolonlardan biri, index atacağınız koonlardan biri ise local index kullanabilirsiniz,

• Index atacağınız kolon unique index olacaksa ve tablo partitionladığınız kolonlardan biri değilse global index kullanabilirsiniz,

• İndexi oluşturmanızdaki sizin için birinci öncelik yönetilebilirliği ise local index kullanmalısınız,

• Eğer OLTP sistem üzerinde bu çalışmayı yapıyor iseniz ve sorgunuzun responce süresi sizin için kritik ise global index, eğer Datawarehouse sistemi üzerinde bu çalışmayı yapıyor iseniz ve kullanıcılar daha çok sorgunun çıktısı ile ilgileniyor ise local index kullanabilirsiniz.

İndex Partitioning ile ilgili bilinmesi gereken zorunluluklar;

• Cluster indexler partition yapılamaz,
• Cluster tablolar üzerine tanımlanacak olan index partition yapılamaz,
• Partition tablo üzerine, partition veya nonpartition index tanımlanabilir,
• Nonpartition tablo üzerine , partition veya nonpartition index tanımlanabilir,
• Bitmap indexler, nonpartition tablolar üzerine partitionlı olarak tanımlanamazlar.
• Bitmap indexler, partitionlı tablolar üzerine local index olarak tanımlanır.

Konuyu biraz detaylandırmak üzere bu index türlerinden biraz daha detaylı bahsedelim ;

Local Partition İndexler;

Partition indexler arasında yönetim en kolay olan indexler local partition indexlerdir. Yukarıda belirttiğimiz üzere daha çok dataware house sistemlerde kullanılmaktadır. Local index’ in her bir partitionı table’ ın partitioning’ I ile tam bir bütünlük içerisindedir. Bu fonksiyonilite oracle tarafından atomatik olarak index partitionların table partitionları ile senkronize olmasını sağlar, her bir table –index partitionı burada birbirinden bağımsız olarak düşünülmektedir. Yapılan her bir işlem sonucunda sadece ilgili index partition kısmı etkilenir.

Local indexlere yeni bir partition ekleyemezsiniz. Local indexe yeni bir partition eklemek için, tabloya yeni bir partition eklenmesi gerekmektedir. Aynı mantıkla baktığımızda local index’ den bir partitionını drop edemezsiniz. Ancak table partitionlarından birini drop ettiğinizde local index’ e ait index de drop edilmiş olur.

Local partition indexler aşağıdaki grafikdende anlaşılacağı üzere table partitioning yapısı üzerine kurulmaktadır.

Örnek bir create scripti ;
CREATE INDEX i_cost1 ON costs_demo (prod_id)
LOCAL
(PARTITION costs_old,
PARTITION costs_q1_2003,
PARTITION costs_q2_2003,
PARTITION costs_recent );

Global Partition İndexler ;

Global Partition indexleri hash ve range olmak üzere iki farklı şekilde inceleyebiliriz;

• Global Range Partition İndex
• Global Hash Partition İndex

Global Range Partition İndex

Global partition indexler partitioning derecesi bakımından oldukça esneklerdir ve partitioning key’ i table partitioning key’ inden bağımsızdır.

Global indexin en son partitionı Maxvalue ile bağlı olmalıdır. Bu şekilde tablodaki tüm değerlerin index içerisinde değerlendirimesini sağlanmış olur.

Global range partition’ a sonradan partition ekleyemezsiniz, çünkü son partition zaten maxvalue ile tüm datayı kapsamaktadır. En sona yeni bir partition eklemek isterseniz ALTER INDEX SPLIT PARTITION komutunu kullanabilirsiniz. Global index partition boş ise yani o partitioning’ e hiçbir data girmemişse, ilgili partitionı ALTER INDEX DROP PARTITION komutunu kullanarak drop edebilirsiniz. Burada önemli olan bir diğer nokta eğer global index parition data içeriyorsa ve bu partitionı drop ettiyseniz, en son partition unusable olacaktır. Global indexlerde son partition drop edilemez.

Örnek bir create scripti ;
CREATE INDEX amount_sold_ix ON sales(amount_sold)
GLOBAL PARTITION BY RANGE(sale_month)
( PARTITION p_100 VALUES LESS THAN (100),
PARTITION p_1000 VALUES LESS THAN (1000),
PARTITION p_10000 VALUES LESS THAN (10000),
PARTITION p_100000 VALUES LESS THAN (100000),
PARTITION p_1000000 VALUES LESS THAN (1000000),
PARTITION p_greater_than_1000000 VALUES LESS THAN (maxvalue));

Global Hash Partition İndex

Global hash partition indexler, index’ in tek bir noktada büyümesi durumunda, performans artırıcı bir etkisi bulunmaktadır.

Örnek bir create scripti ;
CREATE INDEX hgidx ON tab (c1,c2,c3) GLOBAL
PARTITION BY HASH (c1,c2)
(PARTITION p1 TABLESPACE tbs_1,
PARTITION p2 TABLESPACE tbs_2,
PARTITION p3 TABLESPACE tbs_3,
PARTITION p4 TABLESPACE tbs_4);

Buraya kadarki olan kısımda tablo ve index partitiong’ in nasıl yapılacağından, yöntemlerinden ve bunları yaparken bizlere yardımcı olabilecek bazı ipuçlarından bahsettik. Bundan sonraki yazımda 11g ile hayatımıza giren ve daha önceki versiyonlarda kimi zaman bu eksiklikden dolayı zaman zaman partition yapmakdan vazgeçmemize neden olan Interval Partitioning kavramından ve oluşturmuş olduğumuz bu tablo ve index partitionlarını nasıl manage edeceğimizden bahsederek devam etmeyi planlıyorum.

Be Sociable, Share!

2 comments

  1. Teşekkür ederim Uğur,

    Şu aralar şirkette de partitioning ile uğraşıyorum, hazır başlamışken bişeyler de yazayım dedim. Partition konusunda yazacak çok şey var aslında, fırsat bulursam bikaç konu daha var aklımda bakalım 🙂

Bir cevap yazın

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


7 − = bir