Oracle マテリアライズド・ビュー・ログと高速リフレッシュ(FAST REFRESH)完全解説

DBLINK

~MVログを活用した差分更新の仕組みと構築手順~


🔷 この記事の目的

本記事では、Oracleのマテリアライズド・ビューにおける「高速リフレッシュ(FAST REFRESH)」を実現するために必要な構成要素である、マテリアライズド・ビュー・ログ(MVログ)の仕組みと設定方法を詳しく解説します。

また、前回の記事で作成した mv_products を題材に、完全リフレッシュ(COMPLETE)から差分リフレッシュ(FAST)へ切り替える手順を実機ベースで紹介します。


🔷 FAST REFRESH(高速リフレッシュ)とは?

マテリアライズド・ビューのリフレッシュには主に以下の2方式があります:

方式特徴
COMPLETEMV全体を削除 → 再取得(全件再読み込み)
FASTベース表の変更内容(差分)のみを反映

✅ FAST REFRESHの利点

  • MV全体を再取得しないため ネットワーク負荷と時間を大幅に削減
  • INSERT/UPDATE/DELETE の差分のみを適用(高効率)

🔷 FAST REFRESHの前提条件

FAST REFRESHを使用するには、ベース表側に「マテリアライズド・ビュー・ログ(MVログ)」の作成が必要です。

┌────────────┐       ┌────────────┐
│ ベース表 │─────▶│ MVログ │
└────────────┘ └────────────┘
▲ │
│ ▼
└───── 差分を基に MV を更新 ─────▶ MV(FAST)

🔷 MVログとは?

MVログ(Materialized View Log)は、ベース表に対して加えられた変更(INSERT/UPDATE/DELETE)を記録する トリガーベースの差分追跡表 です。

-- MVログ作成例
CREATE MATERIALIZED VIEW LOG ON products
WITH PRIMARY KEY, ROWID
INCLUDING NEW VALUES;
オプション意味
WITH PRIMARY KEY主キーをログに含める
ROWID行IDを使用(高速更新に有利)
INCLUDING NEW VALUESUPDATE時の新値も記録する(必須)

🔷 実機構成:mv_products を FAST REFRESH 対応にする手順

▼ ① ベース表にMVログを作成(PDB02)

-- PDB02 の hr ユーザーで接続
SQL> CONNECT hr/hr@pdb02

-- MVログ作成
CREATE MATERIALIZED VIEW LOG ON products
WITH PRIMARY KEY, ROWID
INCLUDING NEW VALUES;

MVログは、対象のベース表ごとに1つだけ作成できます。
すでに存在する場合は DROP → CREATE が必要です。


▼ ② MV を DROP & 再作成(PDB01)

FAST REFRESH 対応のために、MV自体を再作成します。

-- PDB01 の hr ユーザーで接続
SQL> CONNECT hr/hr@pdb01

-- 既存のMVを削除
DROP MATERIALIZED VIEW mv_products;

-- FAST REFRESH 指定で再作成
CREATE MATERIALIZED VIEW mv_products
REFRESH FAST ON DEMAND
WITH PRIMARY KEY
AS
SELECT * FROM products@pdb02_link;

WITH PRIMARY KEY は MV 側にも主キー列を持たせるために必要です。


▼ ③ 差分データを追加(DBリンク経由)

-- PDB01 から DBリンク経由でデータを追加
INSERT INTO products@pdb02_link VALUES (5, 'Webcam', 7200);
COMMIT;

▼ ④ FAST リフレッシュの実行と確認

-- FAST方式でリフレッシュ(自動的に選択される)
EXEC DBMS_MVIEW.REFRESH('MV_PRODUCTS');

-- データ確認
SELECT * FROM mv_products;

出力例:

PRODUCT_ID  PRODUCT_NAME  PRICE
----------- ------------- -----
1 Keyboard 4000
2 Mouse 2500
3 Monitor 18000
4 Headset 5500
5 Webcam 7200 ← 差分のみ反映

🔷 REFRESHモードの指定方法(参考)

-- FAST(明示的に指定)
EXEC DBMS_MVIEW.REFRESH('MV_PRODUCTS', 'F');

-- COMPLETE
EXEC DBMS_MVIEW.REFRESH('MV_PRODUCTS', 'C');

-- FORCE(デフォルト)
EXEC DBMS_MVIEW.REFRESH('MV_PRODUCTS', 'F');

🔷 MVログの存在確認

-- ユーザーが持つMVログ一覧
SELECT log_table, master, log_owner
FROM user_mview_logs;

-- 結果例
LOG_TABLE MASTER LOG_OWNER
------------------ ---------- ----------
MLOG$_PRODUCTS PRODUCTS HR

🔷 注意点まとめ(FAST REFRESH運用時)

注意点内容
MVログの肥大化差分記録がたまり続けるため、定期リフレッシュやパージが必要
複雑なクエリ非対応集計・結合を含むMVではFAST REFRESHが使えないことがある
ベース表の構造変更MVログが無効になるため、DROPして再作成が必要な場合あり
依存関係管理MVとMVログの両方を一貫して管理する必要がある

🔷 まとめ

FAST REFRESH は、マテリアライズド・ビューの運用においてパフォーマンスと帯域効率の両立を可能にする優れた仕組みです。
その鍵を握るのが マテリアライズド・ビュー・ログ(MVログ) の正しい設計と管理です。

✅ 小規模〜中規模の更新が頻繁にある業務では特に有効  
✅ 差分更新により MVリフレッシュが圧倒的に高速化
✅ 定期リフレッシュやログ管理も含めた運用が重要


[参考]
5 基本的なマテリアライズド・ビュー

コメント

タイトルとURLをコピーしました