この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:3
ページ更新者:guest
更新日時:2026-06-11 07:07:02

タイトル: マテリアライズド・ビュー
SEOタイトル: Oracle マテリアライズド・ビュー 完全ガイド(実体化されたビュー / リフレッシュ / クエリリライト / ファストリフレッシュ)

この記事の要点
  • マテリアライズド・ビュー (Materialized View, MV) は実体としてデータを保持するビュー
  • 通常のビューと違い、クエリ結果をテーブルとして物理保存 — 集計クエリの高速化に絶大な効果
  • リフレッシュ方式: ON DEMAND (手動) / ON COMMIT (元表 commit 時) / 自動スケジュール
  • ファストリフレッシュ: マテリアライズド・ビュー ログを併用して差分のみ更新 — 大規模 MV で必須
  • クエリリライト: オプティマイザが SQL を自動的に MV 参照に書き換える — 透過的に高速化

マテリアライズド・ビューとは

通常のビュー (View) は SQL の問い合わせ定義を保存したもので、参照時に毎回元表のクエリが実行されます。一方マテリアライズド・ビュー (Materialized View, 略称 MV) は、ビューの結果セットを実体としてテーブルに保存します。「実体化されたビュー」と訳されます。

用途: 集計の高速化 / レポーティング / DWH (データウェアハウス) での定番テクニック。毎回 GROUP BY を計算するかわりに、事前計算した結果を読むだけで済むので桁違いに高速になります。

通常ビューとの違い

項目通常のビューマテリアライズド・ビュー
実体SQL 定義のみ実テーブル + SQL 定義
ディスク使用ほぼなし結果セット分を消費
参照速度毎回元表クエリテーブル参照と同等で速い
データの鮮度常に最新リフレッシュ時点
更新コストなしリフレッシュ時に発生
適用シーンセキュリティ / 抽象化集計高速化 / レプリケーション

基本構文

CREATE MATERIALIZED VIEW mv_sales_summary
BUILD IMMEDIATE                           -- 作成時にすぐデータ投入
REFRESH COMPLETE ON DEMAND                -- 手動で完全リフレッシュ
ENABLE QUERY REWRITE                      -- クエリリライト有効化
AS
SELECT
    region_id,
    product_category,
    TRUNC(order_date, 'MM') AS month,
    SUM(amount) AS total_amount,
    COUNT(*)    AS order_count
FROM orders
GROUP BY region_id, product_category, TRUNC(order_date, 'MM');

主なオプション

カテゴリオプション意味
作成タイミングBUILD IMMEDIATE作成と同時にデータ投入 (デフォルト)
BUILD DEFERRED作成時は空。初回リフレッシュで投入
リフレッシュ方式REFRESH COMPLETE全件再計算
REFRESH FAST差分のみ (MV ログが必要)
REFRESH FORCEFAST 可能なら FAST、無理なら COMPLETE (デフォルト)
REFRESH NEVER自動リフレッシュなし
タイミングON DEMAND手動で DBMS_MVIEW.REFRESH (デフォルト)
ON COMMIT元表へ COMMIT したタイミングで自動リフレッシュ
START WITH ... NEXT ...スケジュール指定
クエリリライトENABLE QUERY REWRITEオプティマイザが MV 参照に書き換え可能

リフレッシュ — 手動 / スケジュール

手動リフレッシュ

-- 単一の MV をリフレッシュ
EXEC DBMS_MVIEW.REFRESH('mv_sales_summary');

-- 方式を指定 (C=完全, F=FAST, ?=FORCE)
EXEC DBMS_MVIEW.REFRESH('mv_sales_summary', method => 'C');

-- 複数 MV をまとめて
EXEC DBMS_MVIEW.REFRESH('mv_sales_summary,mv_product_stat', method => 'CC');

スケジュールリフレッシュ

CREATE MATERIALIZED VIEW mv_daily_sales
REFRESH COMPLETE
START WITH SYSDATE                        -- 即時開始
NEXT     SYSDATE + 1                      -- 24 時間ごと
AS
SELECT region_id, SUM(amount) AS total
  FROM orders
 GROUP BY region_id;

ファストリフレッシュ — 差分更新

大規模な MV を毎回 COMPLETE リフレッシュするのは高コスト。マテリアライズド・ビュー ログを元表に作成すると、差分のみを反映する FAST リフレッシュが可能になります。

-- 1. 元表に MV ログを作成
CREATE MATERIALIZED VIEW LOG ON orders
WITH ROWID, SEQUENCE (region_id, product_category, order_date, amount)
INCLUDING NEW VALUES;

-- 2. FAST リフレッシュ対応の MV を作成
CREATE MATERIALIZED VIEW mv_sales_summary
BUILD IMMEDIATE
REFRESH FAST ON COMMIT
ENABLE QUERY REWRITE
AS
SELECT
    region_id,
    product_category,
    SUM(amount)    AS total_amount,
    COUNT(*)       AS order_count,
    COUNT(amount)  AS amount_count    -- FAST リフレッシュには COUNT(amount) も必要
FROM orders
GROUP BY region_id, product_category;

クエリリライト — 自動置き換え

オプティマイザが、ユーザーが書いた SQL を MV 参照に自動的に書き換えてくれる機能。アプリ側のコード変更なしに高速化できます。

-- 設定 (初期化パラメータ)
ALTER SESSION SET QUERY_REWRITE_ENABLED = TRUE;
ALTER SESSION SET QUERY_REWRITE_INTEGRITY = ENFORCED;

-- ユーザーは元表に対して集計クエリを発行
SELECT region_id, SUM(amount)
  FROM orders
 GROUP BY region_id;

-- オプティマイザが内部的に下記に書き換える
SELECT region_id, total_amount
  FROM mv_sales_summary;
QUERY_REWRITE_INTEGRITY意味
ENFORCED整合性が保証されているときのみリライト (デフォルト)
TRUSTED定義された制約を信頼してリライト
STALE_TOLERATEDMV が古くてもリライト (鮮度より速度優先)

典型的なユースケース

ユースケース典型構成
レポーティング / BI ダッシュボード夜間 COMPLETE リフレッシュ + クエリリライト
リアルタイム集計ON COMMIT + FAST + MV ログ
レプリケーションリモート表を MV としてキャッシュ
DWH (データウェアハウス)多次元集計 MV + クエリリライト

監視と管理

-- MV 一覧
SELECT mview_name, refresh_method, refresh_mode, build_mode,
       last_refresh_date, staleness
  FROM user_mviews;

-- MV ログの状態
SELECT log_owner, master, log_table, rowids, sequence
  FROM user_mview_logs;

-- リフレッシュ可否を判定
SELECT capability_name, possible, related_text
  FROM mv_capabilities_table
 WHERE mvname = 'MV_SALES_SUMMARY';

-- MV の削除
DROP MATERIALIZED VIEW mv_sales_summary;
DROP MATERIALIZED VIEW LOG ON orders;

FAQ

Q: いつ MV を導入すべき?
A: 同じ集計クエリが頻繁に走る応答に数秒以上かかる多少データが古くても許される の 3 条件が揃ったときが最有力候補。

Q: ON COMMIT は遅くないの?
A: 元表への COMMIT に MV 更新コストが上乗せされる。更新頻度が低く参照頻度が高い ときに有効。OLTP の高頻度更新表には不向き。

Q: PostgreSQL / SQL Server の同等機能は?
A: PostgreSQL 9.3+ で MATERIALIZED VIEW 構文あり (ファスト相当はなし、REFRESH MATERIALIZED VIEW のみ)。SQL Server はインデックス付きビューが近い機能。

関連

  • パッケージ — Oracle PL/SQL の関連オブジェクト
  • 通常のビュー (CREATE VIEW)
  • パーティション表 — 大規模表のもうひとつの高速化手段
  • DBMS_MVIEW — MV 管理用パッケージ