Oracle Database の ハッシュ・パーティション(HASH PARTITION) の 数は、下記マニュアル曰く
Oracle Database VLDBおよびパーティショニング・ガイド
12cリリース1 (12.1) B71291-09
ハッシュ・パーティション化を使用する場合
http://docs.oracle.com/cd/E57425_01/121/VLDBG/GUID-F023D3ED-262F-4B19-950A-D3C8F8CDB4F4.htm最適なデータ分散を実現するには次の要件を満たす必要があります。
・ 一意またはほぼ一意の列または列の組合せを選択します。
・ 作成するパーティションの数と、各パーティションのサブパーティションの数を2の累乗にします。
たとえば、2、4、8、16、32、64、128などです。
となっていて、2の累乗が(ほぼ必須の?)推奨となってます。
検証してみるやで彡(゚)(゚) まずは4パーティションで試してみる。
-- テーブル作成
DROP TABLE TBL_A PURGE;
CREATE TABLE TBL_A (
C1 NUMBER
)
PARTITION BY HASH (C1)
(
PARTITION P1
, PARTITION P2
, PARTITION P3
, PARTITION P4
);
-- データ投入
INSERT /*+ APPEND */ INTO TBL_A SELECT LEVEL FROM DUAL CONNECT BY LEVEL <= 100000;
COMMIT;
-- 各パーティションカウント
SELECT COUNT(*) FROM TBL_A PARTITION(P1);
SELECT COUNT(*) FROM TBL_A PARTITION(P2);
SELECT COUNT(*) FROM TBL_A PARTITION(P3);
SELECT COUNT(*) FROM TBL_A PARTITION(P4);
結果は以下の通り、ちゃんと分散してるやね彡(^)(^)
SQL> SELECT COUNT(*) FROM TBL_A PARTITION(P1);
COUNT(*)
----------
24945
SQL> SELECT COUNT(*) FROM TBL_A PARTITION(P2);
COUNT(*)
----------
24956
SQL> SELECT COUNT(*) FROM TBL_A PARTITION(P3);
COUNT(*)
----------
25209
SQL> SELECT COUNT(*) FROM TBL_A PARTITION(P4);
COUNT(*)
----------
24890
こいつを 3パーティション で試してみると……
-- テーブル作成
DROP TABLE TBL_A PURGE;
CREATE TABLE TBL_A (
C1 NUMBER
)
PARTITION BY HASH (C1)
(
PARTITION P1
, PARTITION P2
, PARTITION P3
);
-- データ投入
INSERT /*+ APPEND */ INTO TBL_A SELECT LEVEL FROM DUAL CONNECT BY LEVEL <= 100000;
COMMIT;
-- 各パーティションカウント
SELECT COUNT(*) FROM TBL_A PARTITION(P1);
SELECT COUNT(*) FROM TBL_A PARTITION(P2);
SELECT COUNT(*) FROM TBL_A PARTITION(P3);
結果は以下の通り、本当に偏るんすね。(;`・ω・)
SQL> SELECT COUNT(*) FROM TBL_A PARTITION(P1);
COUNT(*)
----------
24945
SQL> SELECT COUNT(*) FROM TBL_A PARTITION(P2);
COUNT(*)
----------
49846 ★このパーティションだけ件数が多い。
SQL> SELECT COUNT(*) FROM TBL_A PARTITION(P3);
COUNT(*)
----------
25209