4.8 パーティションオプション、マテリアライズドビュー
パーティションブルーニング
SQL文のWHERE句で指定された値が、パーティションのキー列で指定されていた場合、オプティマイザは、走査する必要のないパーティションを除外することができるため、不必要なアクセスを低減できます。
WHERE
ORDERDATE BETWEEN
TO_DATE('20040401','YYYYMMDD') AND TO_DATE('20040701','YYYYMMDD')
パーティションワイズ結合
2つの表が、結合列をキーとして同一レベルのパーティション化している場合、ハッシュ結合のパフォーマンスを最大限活かすことができます。
次の例は、データウェアハウス環境で一般的な大規模結合の例です。
上半期の売上データを格納しているSALES表と、顧客表CUSTOMERS表全体を結合し、問い合わせの結果行を求めます。
その際、ハッシュ結合が選択されます。
FROM sales,customers c
WHERE s.cust id=c.cust_id ←cust_id列で結合
AND s.time_id BETWEEN
to_date('2005-04011,'yyyy-mm-dd') and to_date('2005-0701','yyyy-mm-dd')
group by c.cust_name;
その際、パーティション数も同一にすると、下記のようにフルパーティションワイズ結合と呼ばれる最も効率のよいハッシュ結合が選択されます。
同じハッシュ関数を使用して、同じ情報(CUST_ID列)を同数のハッシュパーティションに分散させているため、同じ値が格納されている等価パーティションを結合できます。
一致する1組のハッシュパーティションは、同じパーティション番号をもつ各表のパーティションとして定義されています。
図4-28では、SALES表のパーティション1とCUSTOMERS表のパーティション1が1組のハッシュパーティションとして結合されます。
クラスタ化を検討する際には、このパーティションの組を同じノードに配置することが、パフォーマンス上の重要な設計ポイントになります。
異なるノード上に結合する表を配置した場合、ノードを横断して行を移動させる必要がでてきます(ノード間転送、またはインターコネクト通信のボトルネックとなるため)。
このようにいろいろなメリットがあるパーティションオプションですが、Oracleが現在サポートしている種類は以下の4種類です。
パーティション | 特徴 |
---|---|
レンジパーティション | 列の値の範囲による分割 売上履歴など、日付を使って管理するような履歴データに向いている 各パーティションのサイズが不均一になる可能性がある |
ハッシュパーティション | 指定した列値にハッシュ関数をかけて分割 パーティションサイズがほぼ均一になるため、パラレル処理の効果が高い ハッシュ値を基に分割しているため、範囲検索は向かない パーティションワイズジョイン利用の際有効 |
リストパーティション | 順不同で関連性のないデータの集合を自然な形で分割 指定した値で分割できるので、売上の地域別などの分析業務で有効 |
コンポジットパーティション | 意味のある分割をパーティションで行い、パーティションサイズを均等にするためにハッシュでサブパーティション化する
|
表4-8 パーティショニングオプションの種類
レンジパーティション
レンジパーティションは、列備に基づいて行をパーティションにマップします。
このタイプのパーティションが最もよく使用されるのは、年度やクオータ(四半期)ごと、月ごとの履歴データを大量に管理する必要がある場合です。
レンジパーティションを作成する場合、次の情報を指定します。
- パーティション化の方法
- パーティションキー列(単一列でも複数列でも可)
- 各パーティションの範囲(各パーティションに名前をつけた方がメンテナンスの際便利)
- 格納する際の物理属性(表定義の際のデフォルト値をそのまま使用することもできるが、パーティションごとに設定することも可能)
【構文例】
VALUES LESS THAN句にリテラルを指定している場合、この上限値を超えたり、NULL値を挿入しようとするとエラーになります。
これを防ぐためには、VALUES LESS THAN(MAXVALUE)を指定して、どのパーティションにも含まれない最大値やNULL値、仮想の無限値を格納できるようにしておきます。
レンジパーティション
ハッシュパーティションは、表のデータが履歴データではないため、レンジパーティションを選択できないが、パラレル処理を効率的に行うために、パーティションサイズを均等に配分したい場合に使用します。
また、SQLの条件式で指定される列の値は、等号条件で指定しないと、ハッシュパーティションを効果的に使用することができません。
大規模表のうち、履歴表ではなく、IOの並列処理を最大化させたい場合にハッシュパーティションを選択します。
また、ハッシュパーティションは、大規模な履歴表(売上実績表)と分析のための切り口の情報をもつ表(たとえば商品表)を結合する際に、両方の表をハッシュパーティション化することによって、結合のコストを大幅に削減させることができます。
この機能をパーティションワイズ結合と呼びます。
パーティションワイズ結合を最も効率よく行うためには、2つの表を結合キーで同一レベルでハッシュパーティション化します。
同じハッシュ関数を使用して、同じキーを同数のハッシュパーティションに分散させているため、同じ値が格納されている等価パーティションを結合できます。
ハッシュパーティションを作成する場合、次の情報を指定します。
- パーティション化の方法
- パーティションキー列(単一列でも複数列でも可)
- パーティション数または個々のバーテンションの記述 (各パーティションの名前は、レンジのときほど必要ではない)
- パーティション数と格納される表領域を指定しておけば、自動的にパーティション名がつけられ、表領域も自動的に選択される
- データ量が均等になるためには、パーティション数を2の累乗に設定する
【表領域を自動的に選択させる場合の構文例】
解説トレーナー