ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
マテリアライズド・ビューとは
通常のビュー (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 FORCE | FAST 可能なら 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_TOLERATED | MV が古くてもリライト (鮮度より速度優先) |
典型的なユースケース
| ユースケース | 典型構成 |
|---|---|
| レポーティング / 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 管理用パッケージ
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページはありません
同階層のページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript base URL 取得方法|window.location.origin と SSR/Node.js 対応
- 4 YouTube Data API v3 エラー一覧|403/400/404 の主要原因と切り分け
- 5 Spring Frameworkのアノテーション一覧
- 6 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- IPv6とは|128bitアドレス・コロン16進表記/::省略・リンクローカル・SLAAC・デュアルスタック NEW 2026-06-22 12:34:44
- VPNとは|暗号トンネル・サイト間/リモートアクセス・IPsec/SSL-VPN/WireGuardを解説 NEW 2026-06-22 12:19:10
- MAC アドレスフィルタリングの仕組みと限界 | ネットワーク入門 NEW 2026-06-22 12:19:10
- gRPC とは HTTP/2 + Protocol Buffers の高速 RPC | ネットワーク入門 NEW 2026-06-22 12:17:25
- WebRTC とは ブラウザ間 P2P の音声・映像・データ通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/2 とは 多重化・HPACK・バイナリフレーム | ネットワーク入門 NEW 2026-06-22 12:17:25
- Web通信プロトコル入門 HTTP/2・HTTP/3・WebSocket・gRPC・WebRTC | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/3 (QUIC) とは UDP ベースの低遅延 Web 通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- WebSocket とは 全二重リアルタイム通信 ws/wss | ネットワーク入門 NEW 2026-06-22 12:17:25
- 証明書と認証局(CA)とは|X.509・信頼チェーン・DV/OV/EV・失効(CRL/OCSP)を解説 NEW 2026-06-22 12:17:24
- ファイアウォールとは|パケットフィルタ・ステートフル・DMZ・次世代FW(L4/L7)を解説 NEW 2026-06-22 12:17:24
- iptables/nftablesとは|テーブル・チェーン・ルール例・永続化をLinux視点で解説 NEW 2026-06-22 12:17:24
- HAProxy とは frontend/backend と設定例 | ネットワーク入門 NEW 2026-06-22 12:17:24
- CDN とは エッジキャッシュ・TTL・Cloudflare/CloudFront | ネットワーク入門 NEW 2026-06-22 12:17:24
- TLS/SSLの仕組み|ハンドシェイク・暗号スイート・前方秘匿性・証明書検証をわかりやすく解説 NEW 2026-06-22 12:17:24
コメントを削除してもよろしいでしょうか?