Oracleのマテリアライズドビュー運用に関するメモ書きです。
■確認・動作環境
| 項目名 | バージョン |
|---|---|
| OS | Windows Server 2008 R2 |
| Oracle | 10gR2 / 11gR2 |
■マテリアライズドビューとは
マテリアライズドビューとは通常の「ビュー」とは異なり、実体を伴うビューとなります。「実体を伴う」とはつまり、「問い合わせ結果をテーブルデータとして保存している」ということになります。通常のビューはアクセスの度に問い合わせ(SELECT)を実行しているのでこの点が異なります。
通常のビューのようにアクセスの都度、元のデータを参照する訳ではないので、マテリアライズドビューは時間軸で見たある時点におけるデータの断面となります。ここで問い合わせ元となるデータを「マスター表」と呼び、ビュー結果を保存するデータを「レプリケーション表」と呼びます。
レプリケーション表は時間軸で見るとあるタイミングのデータであり、最新の状態ではありませんので、何らかの方法でマスターのデータを同期する必要がでてきます。このマスターとレプリケーション表の間のデータの更新する方法として「完全リフレッシュ」と「高速リフレッシュ」があります。
▼マテリアライズドビューの定義
CREATE MATERIALIZED VIEW MV_商品マスタ AS SELECT * FROM 商品マスタ;
後述する更新(リフレッシュ)方法の内、高速リフレッシュを用いたい場合は、マスター表に関連づくマテリアライズドビューログ、そしてマテリアライズドビューの作成を行います。マテリアライズドビューログとは「変更差分」を基にした高速リフレッシュを実現するための変更履歴データを保持する特殊なテーブルです。
CREATE MATERIALIZED VIEW LOG ON 商品マスタ TABLESPACE TS_MLOG WITH PRIMARY KEY INCLUDING NEW VALUES;
マテリアライズドビューは「REFRESH FAST」句を用いて差分更新ができるように定義します。
CREATE MATERIALIZED VIEW MV_商品マスタ REFRESH FAST ON DEMAND AS SELECT * FROM 商品マスタ;
▼マテリアライズドビューの更新
- 完全リフレッシュ・・・マスター表のデータをレプリケーション表へ全て同期する
- 高速リフレッシュ・・・前回からの変更差分のみをマスター表とレプリケーション表で同期する
完全リフレッシュ、高速リフレッシュともにsqlplusなどから「dbms_mview」の関数を呼び出して実行します。完全リフレッシュと高速リフレッシュの呼び方はほぼ同じで2つ目のパラメータが完全リフレッシュの場合は「c」となります。
EXEC dbms_mview.refresh('商品マスタ','c');
高速リフレッシュは2つ目のパラメータで「f」を指定します。
EXEC dbms_mview.refresh('商品マスタ','f');
完全リフレッシュか高速リフレッシュかを自動選択させる「強制リフレッシュ」というしてもできます。この場合は2つ目のパラメータで「?」を指定します。
EXEC dbms_mview.refresh('商品マスタ','?');
完全リフレッシュの注意点としてはテーブルのフルスキャンが発生するので、当然ですが処理に時間がかかる点です。また、レプリケーション表にインデックスが貼ってある場合はさらにそのインデックス更新に時間がかかるので一旦インデックスを削除してから完全リフレッシュを行い、その後インデックスを再作成するなどの必要が発生するかもしれません。
また、デフォルトの設定で完全リフレッシュを行うと単一トランザクションで実行されるため、大量のデータの処理によりUNDO表領域がパンクする可能性があります。「atomic_refresh=>FALSE」というパラメータを設定することでマテリアライズドビューの全件削除がDELETEからTRUNCATEに変わるようです。(TRUNCATEだとUNDO、REDOログが生成されないためUNDO表領域のパンクを心配しなくて良くなる)
EXEC dbms_mview.refresh(list=>'商品マスタ', method=>'c', atomic_refresh=>FALSE);
▼マテリアライズドビュー関連エラー対応
高速リフレッシュで更新差分を同期する運用環境において、テーブル構成の変更などによりマテリアライズドビューログを再作成した場合などはマテリアライズドビューは一度完全リフレッシュする必要があります。当該状況では以下のエラーが発生します。対応としては一度完全リフレッシュを実行してOracle内部で保持している情報の整合性を取り直す必要があります。
他に「ORA-12034」が発生するケースとしては高速リフレッシュ対象のマスタテーブルのレコードをtruncateした場合などです。この場合もマテリアライズドビューログの整合性が取れないと判断され、完全リフレッシュが必要となります。
ORA-12034:”TST”.”商品マスタ”のマテリアライズド・ビュー・ログは最終リフレッシュよりも新しいものです。
更新履歴:2025/07/28、2025/07/01、2025/01/31
コメントを残す