データベース操作・制御

マテリアライズドビュー まてりあらいずどびゅー

ビューキャッシュクエリ最適化集計パフォーマンスREFRESH
マテリアライズドビューについて教えて

簡単に言うとこんな感じ!

マテリアライズドビューは「クエリ結果のスナップショットを実際に保存しておく」ビューだよ! 普通のビューは毎回SQLを実行するけど、マテリアライズドビューは計算結果をファイルに保存して即返せる。ちょっと古いデータでいいなら爆速で集計結果を返せるんだ!


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

マテリアライズドビュー(Materialized View)とは、ビューのSELECTクエリの実行結果を物理的にストレージに保存する仕組みです。「マテリアライズ(materialize)」は「実体化する」という意味で、通常のビュー(仮想テーブル)と異なり、実データを持つ点が特徴です。

通常のビューは参照のたびにSQLを再実行するため、複雑なJOINや集計があると参照のたびに重い処理が走ります。マテリアライズドビューは結果を事前に計算・保存しておくため、参照時はその保存データを返すだけで済み、大幅に高速化できます。

トレードオフは鮮度(freshness)です。保存済みデータは元テーブルが更新されても自動では変わらないため、「REFRESH(更新)」という操作が必要です。リアルタイム性より速度を優先したいレポート・ダッシュボード・集計用途に最適です。


ビュー vs マテリアライズドビューの比較

比較項目通常のビューマテリアライズドビュー
データ保存なし(仮想)あり(実体)
参照速度毎回SQLを実行→遅い場合あり保存データを返す→高速
データの鮮度常に最新REFRESHするまで古い可能性あり
ディスク使用ほぼなし実データ分を使用
向いている用途リアルタイム性が必要な参照重い集計・レポート・ダッシュボード
インデックス作成不可作成可能(さらに高速化)
通常ビュー vs マテリアライズドビュー 通常のビュー ① SELECT * FROM view_name ② 毎回 SQL を実行 ③ テーブルをスキャン・JOIN・集計 ④ 結果を返す 常に最新データ 複雑なクエリは遅い マテリアライズドビュー ① SELECT * FROM mat_view ② 保存済みデータを即返す (別途 REFRESH で最新化) REFRESH MATERIALIZED VIEW mv; 爆速で結果を返す 少し古いデータの可能性 集計・レポート用途では速度優先でマテリアライズドビューが定石

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以降マテリアライズドビューの概念が標準化議論に加わる

関連用語