マテリアライズド・ビュー・リフレッシュによるパフォーマンス向上

マテリアライズド・ビューとは、その名が示すとおり“実体のあるビュー”のことです。 マテリアライズド・ビューは、Oracle のレプリケーション機能のひとつであるスナップショットのメカニズムを使用して実装されています。 マテリアライズド・ビューを使用することで、複雑な問合せ処理をあらかじめ行うことができるため、ビジネス・インテリジェンスの生産性を飛躍的に高めることができます。

マテリアライズド・ビューには、たとえば、特定期間における地域別の給与総額など、事前定義された問合せの結果が含まれています。定義するマテリアライズド・ビューの数に制限はありません。 SQL問合せを発行すると、Oracle内のクエリー・リライト機能によって適切なマテリアライズド・ビューが使用可能であるかどうかが判断します。 使用可能な場合は、Oracleは透過的に問合せをリライトして、代わりにマテリアライズド・ビューが使用されるようにします。 この結果、問合せは問合せによって参照される表内のすべての行ではなく、マテリアライズド・ビューにある少数の行にアクセスするため、パフォーマンスが大幅に改善されます。

マテリアライズド・ビューの基礎となる表が更新されるたびに、Oracleはそのマテリアライズド・ビューを 失効(stale)とマークします。
QUERY_REWRITE_INTEGRITYを stale_toleratedに設定しない限り、失効したマテリアライズド・ビューはクエリー・リライト・エンジンで使用されなくなります。 Oracleは、実表に関してマテリアライズド・ビューを常に最新のものにする、 マテリアライズド・ビュー・リフレッシュと呼ばれるメカニズムを提供します。

マテリアライズド・ビューのリフレッシュについて次のタイプの設定をサポートします。
  • 完全リフレッシュ - 再作成処理
  • 高速リフレッシュ - データ変更のみを適用
  • 強制リフレッシュ - 高速リフレッシュを試行し、不可能な場合には完全リフレッシュを実行
  • なし - マテリアライズド・ビューをリフレッシュしない
マテリアライズド・ビューにはそれぞれ個別にリフレッシュ方法が設定されます。 マテリアライズド・ビューを定義する問合せによって、適用可能なリフレッシュ方法が制限されます。 そのため、マテリアライズド・ビューが必ずしも高速リフレッシュできるとは限りません。 すべてのマテリアライズド・ビューは、完全リフレッシュを使用してリフレッシュすることができます。

マテリアライズド・ビューは最新のデータ変更を反映させるタイミングとしてON DEMANDまたはON COMMITを定義することができます。

ユーザーは、リフレッシュのタイミングを自由にON DEMANDを選択することによってマテリアライズド・ビューのリフレッシュを制御することができます。Oracleは、リフレッシュON DEMANDに対して次のプロシージャを提供します。
  • DBMS_MVIEW.REFRESH - リフレッシュするマテリアライズド・ビューを1つまたは複数選択する
  • DBMS_MVIEW.REFRESH_DEPENDENT - 表に依存するマテリアライズド・ビューをリフレッシュする
  • DBMS_MVIEW.REFRESH_ALL_MVIEWS - すべてのマテリアライズド・ビューをリフレッシュする
ユーザーがリフレッシュON COMMITを選択した場合、Oracleはマテリアライズド・ビューによって参照される表を更新するトランザクションがコミットされるたびに、そのマテリアライズド・ビューを自動的にリフレッシュします。

Oracle9iでは、マテリアライズド・ビュー・リフレッシュが大幅に改善されています。
  • SQL DML文(INSERT、UPDATE、DELETE)を使用して実表が変更された場合でも、結合と集計を含むマテリアライズド・ビューに対 して高速リフレッシュが可能になりました。Oracle8iでは、結合と集計を含むマテリアライズド・ビューの高速リフレッシュは、 SQL*Loaderダイレクト・パスを使用して実表が挿入された場合にのみ可能でした。

  • 高速リフレッシュで使用されるアルゴリズムが変更され、この処理のパフォーマンスが飛躍的に改善されています。

  • マテリアライズド・ビューで参照される表でTRUNCATE PARTITIONなどのパーティション・メンテナンス処理が行われた後で、 高速リフレッシュが可能になりました。

  • パーティション・チェンジ・トラッキング(PCT)と呼ばれる新しいメカニズムが導入されました。このメカニズムは、 マテリアライズド・ビューが最後にリフレッシュされてから更新された実表のパーティションを追跡します。 これにより、Oracleはマテリアライズド・ビューの最新データをパーティション毎に識別できるようになります。

  • FROM句とCUBE、ROLLUP、およびGROUPING SET関数に対して副問合せで高速リフレッシュが可能になりました。

上記の拡張をサポートするために、Oracle9iでは常にマテリアライズド・ビュー・ログを作成する必要があります。

Oracle9i におけるマテリアライズド・ビュー・リフレッシュにより、マテリアライズド・ビューのメンテナンスが飛躍的に高速かつ簡単になります。これらの拡張により、いくつかのインスタンスでリフレッシュ実行のためにすべてのデータにアクセスする必要がなくなり、リフレッシュ全般のパフォーマンスが向上します。


追加情報
 Oracle9i Database 技術資料 - Business Intelligence (データ・ウェアハウス) - Oracle9i のマテリアライズド・ビュー
 Oracle9i Database マニュアル(ドキュメント) - Performance&Replication - Oracle9i レプリケーション

Oracle9i Database Daily Feature
 アーカイブ