4.8 パーティションオプション、マテリアライズドビュー
大規模データベースで性能を発揮するためのOracleの機能であるパーティションオプションとマテリアライズドビューについて説明します。
非正規化を行わなくても、パーティションオプション、マテリアライズドビューなどのOracleの機能を使用することによって、性能の問題は解決する場合が多いといえます。
ただし、管理の負荷が増えるため、要員の教育と各機能の正確な理解が必要になります。
4.8.1 パーティションオプション
パーティションオプションは、大規模表へのアクセスを効率よく行うための機能です。
インターネットの普及に伴い、データベースで扱うデータ量はますます増加しています。
このような大規模なオブジェクト(表や索引)のメンテナンスは非常に困難で、対象が膨大であるため、パフォーマンスにも大きな影響を及ぼします。
このような大規模な表や索引を、論理的には1つの表または索引でありながら、物理的にパーティションと呼ばれる区画に分割することによって、管理性、パフォーマンスを向上させることができます。
パーティション表に対するSQL文は、普通の表に対するアクセスと変わりません。
論理的には1つの表であるため、パーティション化された表に対しても、既存のアプリケーションによるDML文は透過的に実行されます。
必要であれば、特定のパーティションのみにアクセスを行わせたり、パーティションを単位としたパラレルDML文の実行も可能です。
パインド変数の使い方の例
パーティション化の利点としては次のようなことが挙げられます。
- 高可用性: 物理的に分けることで、個別の単位でメンテナンスが可能になる障害が起きたとき、他のパーティションは使用を継続できる
- 管理の容易さ:
パーティションを操作するコマンドが提供されているため、パーティション単位の表領域の移動や削除、追加が可能 - パフォーマンスの向上:
SQL文のWHERE句で指定された値が、パーティションのキー列で指定されていた場合、オプティマイザは走査する必要のないパーティションを除外できるため、不必要なアクセスを低減できる(パーティションブルーニング)
パーティション化した領域に対して、パラレル処理を実行できる
たとえば、大規模な表に対する検索、結合処理、集計、コピー処理、大量ロード、更新/削除処理、ソート処理をパーティションごとに分けて実行し、最終的にその結果をまとめることができる
次に、具体例を挙げて説明します。
高可用性
論理的には1つの表ですが、パーティションに分けることによって、格納する領域を物理的に分けることができます。
物理的な障害が起きた場合、障害の範囲を局所化することができます。
障害が起きたパーティション以外のパーティションは影響を受けません。
管理の容易さ
パーティションの単位で操作するコマンドが提供されているため、パーティション単位での追加や削除、表領域間の移動などが可能です。
また、データ量に不均衡があった場合の分割や、表をパーティションとして追加するなどの管理作業を容易に行うことができます。
追加
- レンジパーティション
- 最も値の大きい側にパーティションを追加する場合、add partition句を使用する
表の先頭または中間にパーティションを追加する場合、split partition句を使用する - MAXVALUEパーティションを含むレンジパーティション表には、パーティションを追加するのではなく、split partition句を使用してパーティションを分割する
指定した値で定義された新しいパーティションが追加され、MAXVALUE句のパーティションは、最大値を格納するパーティションとしてそのまま残る - ハッシュパーティション:新しいハッシュパーティションが追加されると、ハッシュ関数によって既存のパーティションが選択され、再ハッシュされた行が挿入される
ハッシュパーティションを追加する場合には、追加した結果、パーティション数が2の累乗になるようにし、各パーティションの行数が同等になるよう注意すること - リストパーティション:デフォルトパーティションを含むパーティションに、パーティションを追加したい場合には、デフォルトパーティションをsplit partition句を使用してパーティション分割する
分割することにより、新しい値を含むパーティションが追加され、デフォルトパーティションはそのまま残る
DROP PARTITION p1995;
- レンジ、compositレンジハッシュのメインパーティション、リスト、compositレンジリストの各パーティション表からパーティションを削除できる
- ハッシュ、compositレンジハッシュのハッシュサブパーティションはcoalesce partition句を使用して表のパーティションを1つ減らす作業を行う
ALTER TABLE sales MODIFY PATITION us_locations COALESCE SUBPARTITION (ハッシュサブパーティション)
- 参照整合性制約が設定されているパーティションを削除する場合、制約を無効化した後にパーティションを削除する必要がある
ALTER TABLE sales DROP PARTITION dec2000;
ALTER TABLE sales ENABLE CONSTRAINT dname_sales;
結合
MERGE PARTITIONS p1995Ql,p1995Q2 INTO PARTITION p1995H1;
- レンジパーティションの結合は、隣接している2つのパーティションの場合のみ可能
- この文は、ハッシュパーティション表、compositレンジハッシュパーティション表のハッシュサブパーティションには使用できない
これらのパーティション結合にはcoalesce partition句を使用する - 2つのパーティションの内容を1つのパーティションにマージする際、元の2つのパーティションは削除される
- パーティションのマージは、たとえば、古い履歴データを、今までよりも大きい単位で管理するために使う
分割
SPRIT PARTITION p2000 AT(TO_DATE('20000701','YYYYMMDD'))
INTO(PARTITION p2000H1 TABLESPACE p2000H1,
PARTITION p2000H2 TABLESPACE p2000H2);
- 1つのパーティションの行を2つのパーティションに分割することによって、データ量を再配分する際に使用する
- ハッシュパーティションにはこのコマンドは使用できない
表パーティションと非パーティション表の交換
EXCHANGE PARTITION p2005 WITH TABLE t2005ord
EXCHANGEコマンドでは、データディクショナリの定義が更新され、表パーティションが表に、表が表パーティションに変換されます。
たとえば、オンラインの業務で使用されていた売上表を、月末の締め処理終了後、バッチ処理でパーティションに追加するという運用を考えることができます。
EXPORT/IMPORT処理を行うわけではなく、ディクショナリの書き換えだけなので、表からパーティション表の一部に一瞬で組み込むことができます。
パーティションに組み込んだ後、該当月の売上高も分析対象として組み込むことができます。
解説トレーナー