LoginSignup
2
1

More than 5 years have passed since last update.

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

Posted at

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
2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1