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