~MVログを活用した差分更新の仕組みと構築手順~
🔷 この記事の目的
本記事では、Oracleのマテリアライズド・ビューにおける「高速リフレッシュ(FAST REFRESH)」を実現するために必要な構成要素である、マテリアライズド・ビュー・ログ(MVログ)の仕組みと設定方法を詳しく解説します。
また、前回の記事で作成した mv_products を題材に、完全リフレッシュ(COMPLETE)から差分リフレッシュ(FAST)へ切り替える手順を実機ベースで紹介します。
リンク
リンク
リンク
🔷 FAST REFRESH(高速リフレッシュ)とは?
マテリアライズド・ビューのリフレッシュには主に以下の2方式があります:
| 方式 | 特徴 |
|---|---|
| COMPLETE | MV全体を削除 → 再取得(全件再読み込み) |
| 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 VALUES | UPDATE時の新値も記録する(必須) |
🔷 実機構成: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リフレッシュが圧倒的に高速化
✅ 定期リフレッシュやログ管理も含めた運用が重要


コメント