マテリアライズドビュー まてりあらいずどびゅー
ビューキャッシュクエリ最適化集計パフォーマンスREFRESH
マテリアライズドビューについて教えて
簡単に言うとこんな感じ!
マテリアライズドビューは「クエリ結果のスナップショットを実際に保存しておく」ビューだよ! 普通のビューは毎回SQLを実行するけど、マテリアライズドビューは計算結果をファイルに保存して即返せる。ちょっと古いデータでいいなら爆速で集計結果を返せるんだ!
マテリアライズドビューとは
マテリアライズドビュー(Materialized View)とは、ビューのSELECTクエリの実行結果を物理的にストレージに保存する仕組みです。「マテリアライズ(materialize)」は「実体化する」という意味で、通常のビュー(仮想テーブル)と異なり、実データを持つ点が特徴です。
通常のビューは参照のたびにSQLを再実行するため、複雑なJOINや集計があると参照のたびに重い処理が走ります。マテリアライズドビューは結果を事前に計算・保存しておくため、参照時はその保存データを返すだけで済み、大幅に高速化できます。
トレードオフは鮮度(freshness)です。保存済みデータは元テーブルが更新されても自動では変わらないため、「REFRESH(更新)」という操作が必要です。リアルタイム性より速度を優先したいレポート・ダッシュボード・集計用途に最適です。
ビュー vs マテリアライズドビューの比較
| 比較項目 | 通常のビュー | マテリアライズドビュー |
|---|---|---|
| データ保存 | なし(仮想) | あり(実体) |
| 参照速度 | 毎回SQLを実行→遅い場合あり | 保存データを返す→高速 |
| データの鮮度 | 常に最新 | REFRESHするまで古い可能性あり |
| ディスク使用 | ほぼなし | 実データ分を使用 |
| 向いている用途 | リアルタイム性が必要な参照 | 重い集計・レポート・ダッシュボード |
| インデックス | 作成不可 | 作成可能(さらに高速化) |
PostgreSQLでの使用例
-- マテリアライズドビューの作成
CREATE MATERIALIZED VIEW mv_monthly_sales AS
SELECT
DATE_TRUNC('month', ordered_at) AS month,
product_id,
SUM(amount) AS total_sales,
COUNT(*) AS order_count
FROM orders
GROUP BY 1, 2;
-- インデックスも作れる(さらに高速化)
CREATE INDEX ON mv_monthly_sales (month, product_id);
-- データを最新化(夜間バッチで実行するイメージ)
REFRESH MATERIALIZED VIEW mv_monthly_sales;
-- 更新中も読めるようにしたい場合(PostgreSQL 9.4以降)
REFRESH MATERIALIZED VIEW CONCURRENTLY mv_monthly_sales;
歴史と背景
- 1990年代初頭:Oracle がマテリアライズドビュー(当初は「スナップショット」と呼称)を商用実装した先駆け
- 1997年頃:Oracle 8 で「マテリアライズドビュー」と名称が統一。問い合わせ書き換え(Query Rewriting)機能が追加される
- 2000年代:データウェアハウス(DWH)向けのパフォーマンス技術として定着
- 2013年:PostgreSQL 9.3 でマテリアライズドビューを標準サポート
- 2014年:PostgreSQL 9.4 で
CONCURRENTLYオプション追加(更新中もビューが利用可能) - 現在:BigQuery・Snowflake・RedshiftなどクラウドDWHがマテリアライズドビューを標準サポート。BI/レポートツールのバックエンドとして広く使われる
関連する規格・RFC
| 規格 | 内容 |
|---|---|
| Oracle マテリアライズドビュー仕様 | 問い合わせ書き換え・増分リフレッシュなどの先行実装 |
| ISO/IEC 9075 SQL:2003以降 | マテリアライズドビューの概念が標準化議論に加わる |
関連用語
- ビュー — 実データを持たない仮想テーブル(通常のビュー)
- インデックス — 検索を高速化するための索引構造
- クエリ最適化・実行計画 — クエリを効率よく実行するためのDBエンジンの最適化処理
- パーティショニング — テーブルを分割して管理・検索効率を上げる技術
- トリガー — テーブル変更を契機に自動実行されるDB内プログラム
- バキューム・VACUUM — 不要データ領域を回収するPostgreSQLの管理機能
- レプリケーション — データを複数サーバーに複製して可用性を高める仕組み