パーティショニングとはユーザーからは一つに見える表を、複数の表に分割する機能です。
1つの表で管理する場合と比べて、パーティショニングすることによってパフォーマンスの向上が見込めます。
例えば、2010年から2016年の売上を管理する表があって、2016年の売上を確認したいことがあったとします。
その場合、パーティショニングを利用していないと、2010年から2016年までのデータを検索しなければなりません。一方、パーティショニングを利用して、表を2010年表、2011年表・・・2016年表という感じに分割すると、ユーザーは2016年表だけ見ればいいのです。
ユーザーはどの表を見ているかを意識することがありません。
さて、パーティショニング機能ですが、表を分割する方法が複数存在します。
今回はそれぞれ見ていきます。
CREATE TABLE sales_range
(id NUMBER(5),
name VARCHAR2(30),
sales_amount NUMBER(10),
sales_date DATE
)TABLESPACE tbs1
PARTITION BY RANGE(sales_date)
(PARTITION p2016q1 VALUES LESS THAN(TO_DATE('2016-04-01',
'YYYY-MM-DD')),
PARTITION p2016q2 VALUES LESS THAN(TO_DATE('2016-07-01',
'YYYY-MM-DD')),
PARTITION p2016q3 VALUES LESS THAN(TO_DATE('2016-10-01',
'YYYY-MM-DD')),
PARTITION p2016q4 VALUES LESS THAN(TO_DATE('2017-01-01',
'YYYY-MM-DD')));
1つはレンジパーティション
基準となる値を範囲を区切ってパーティショニングします。
例えば上記の場合、2016年を四半期ごとの区切っています。
1つの表が4つの表に分割されました。
CREATE TABLE sales_list
(id NUMBER(5),
name VARCHAR2(30),
sales_state VARCHAR2(20),
sales_amount NUMBER(10),
sales_date DATE
)TABLESPACE tbs1
PARTITION BY LIST(sales_state)
(PARTITION sales_kanto VALUES ('Kanagawa','Tokyo'),
PARTITION sales_kansai VALUES ('Osaka','Kobe'),
PARTITION sales_kyusyu VALUES ('Fukuoka','Nagasaki'),
PARTITION sales_tohoku VALUES ('Miyagi','Aomori'));
二つ目はリストパーティション
連続していない値を基準にして、特定の値で分割しています。
例えば上記の場合、地域ごとに4分割しています。
CREATE TABLE sales_hash
(id NUMBER(5),
name VARCHAR2(30),
sales_amount NUMBER(10),
week_no NUMBER(2)
)TABLESPACE tbs1
PARTITION BY HASH(id)
PARTITIONS 4;
三つ目はハッシュパーティション
基準となる列のハッシュ値を取得して、それに基づいて表を分割します。
分割数は任意に決めることが出来ますが、2の累乗である必要があります。
上記の場合、id列のハッシュ値を取得して、4分割しています。
CREATE TABLE sales_composite
(id NUMBER(5),
name VARCHAR2(30),
sales_amount NUMBER(10),
sales_date DATE
)TABLESPACE tbs1
PARTITION BY RANGE(sales_date)
SUBPARTITION BY HASH(id)
SUBPARTITIONS 4
(PARTITION p2016q1 VALUES LESS THAN(TO_DATE('2016-04-01',
'YYYY-MM-DD')),
PARTITION p2016q2 VALUES LESS THAN(TO_DATE('2016-07-01',
'YYYY-MM-DD')),
PARTITION p2016q3 VALUES LESS THAN(TO_DATE('2016-10-01',
'YYYY-MM-DD')),
PARTITION p2016q4 VALUES LESS THAN(TO_DATE('2017-01-01',
'YYYY-MM-DD')));
最後に、それらの分割手法を複数利用することが出来ます。
例えば上記の場合、日付のレンジパーティションで4分割して、それぞれはidのハッシュ値で4分割しています。
結局、4*4=16分割されます。
また、レンジパーティションで分割して、されにリストパーティションで分割することも可能です。
1つの表で管理する場合と比べて、パーティショニングすることによってパフォーマンスの向上が見込めます。
例えば、2010年から2016年の売上を管理する表があって、2016年の売上を確認したいことがあったとします。
その場合、パーティショニングを利用していないと、2010年から2016年までのデータを検索しなければなりません。一方、パーティショニングを利用して、表を2010年表、2011年表・・・2016年表という感じに分割すると、ユーザーは2016年表だけ見ればいいのです。
ユーザーはどの表を見ているかを意識することがありません。
さて、パーティショニング機能ですが、表を分割する方法が複数存在します。
今回はそれぞれ見ていきます。
CREATE TABLE sales_range
(id NUMBER(5),
name VARCHAR2(30),
sales_amount NUMBER(10),
sales_date DATE
)TABLESPACE tbs1
PARTITION BY RANGE(sales_date)
(PARTITION p2016q1 VALUES LESS THAN(TO_DATE('2016-04-01',
'YYYY-MM-DD')),
PARTITION p2016q2 VALUES LESS THAN(TO_DATE('2016-07-01',
'YYYY-MM-DD')),
PARTITION p2016q3 VALUES LESS THAN(TO_DATE('2016-10-01',
'YYYY-MM-DD')),
PARTITION p2016q4 VALUES LESS THAN(TO_DATE('2017-01-01',
'YYYY-MM-DD')));
1つはレンジパーティション
基準となる値を範囲を区切ってパーティショニングします。
例えば上記の場合、2016年を四半期ごとの区切っています。
1つの表が4つの表に分割されました。
CREATE TABLE sales_list
(id NUMBER(5),
name VARCHAR2(30),
sales_state VARCHAR2(20),
sales_amount NUMBER(10),
sales_date DATE
)TABLESPACE tbs1
PARTITION BY LIST(sales_state)
(PARTITION sales_kanto VALUES ('Kanagawa','Tokyo'),
PARTITION sales_kansai VALUES ('Osaka','Kobe'),
PARTITION sales_kyusyu VALUES ('Fukuoka','Nagasaki'),
PARTITION sales_tohoku VALUES ('Miyagi','Aomori'));
二つ目はリストパーティション
連続していない値を基準にして、特定の値で分割しています。
例えば上記の場合、地域ごとに4分割しています。
CREATE TABLE sales_hash
(id NUMBER(5),
name VARCHAR2(30),
sales_amount NUMBER(10),
week_no NUMBER(2)
)TABLESPACE tbs1
PARTITION BY HASH(id)
PARTITIONS 4;
三つ目はハッシュパーティション
基準となる列のハッシュ値を取得して、それに基づいて表を分割します。
分割数は任意に決めることが出来ますが、2の累乗である必要があります。
上記の場合、id列のハッシュ値を取得して、4分割しています。
CREATE TABLE sales_composite
(id NUMBER(5),
name VARCHAR2(30),
sales_amount NUMBER(10),
sales_date DATE
)TABLESPACE tbs1
PARTITION BY RANGE(sales_date)
SUBPARTITION BY HASH(id)
SUBPARTITIONS 4
(PARTITION p2016q1 VALUES LESS THAN(TO_DATE('2016-04-01',
'YYYY-MM-DD')),
PARTITION p2016q2 VALUES LESS THAN(TO_DATE('2016-07-01',
'YYYY-MM-DD')),
PARTITION p2016q3 VALUES LESS THAN(TO_DATE('2016-10-01',
'YYYY-MM-DD')),
PARTITION p2016q4 VALUES LESS THAN(TO_DATE('2017-01-01',
'YYYY-MM-DD')));
最後に、それらの分割手法を複数利用することが出来ます。
例えば上記の場合、日付のレンジパーティションで4分割して、それぞれはidのハッシュ値で4分割しています。
結局、4*4=16分割されます。
また、レンジパーティションで分割して、されにリストパーティションで分割することも可能です。
