ねら~ITエンジニア雑記

やきうのお兄ちゃんが綴るOracle Databaseメインのブログ

Oracle Database の ハッシュ・パーティション(HASH PARTITION) の 数 は 2の累乗 が良いそうだが、本当にそうか検証してみる。

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

Qiita にも書いたやで! 彡(^)(^)

http://qiita.com/ora_gonsuke777/items/aa65f2d973931be10257