マテリアライズドビュー
クエリ結果を事前に計算・保存し、読み取り性能を向上させるデータベースの仕組み
データベースパフォーマンス
マテリアライズドビューとは
マテリアライズドビュー (Materialized View) は、複雑なクエリの結果を事前に計算してテーブルとして保存し、読み取り時に再計算を不要にする仕組みである。通常のビュー (仮想テーブル) がクエリ実行時に毎回計算するのに対し、マテリアライズドビューは結果をディスクに保存する。
ビュー vs マテリアライズドビュー
| 観点 | ビュー | マテリアライズドビュー |
|---|---|---|
| データ保存 | なし (クエリ定義のみ) | あり (結果をディスクに保存) |
| 読み取り速度 | 遅い (毎回計算) | 速い (事前計算済み) |
| データの鮮度 | 常に最新 | リフレッシュまで古い |
| ストレージ | 不要 | 必要 |
PostgreSQL での使用
-- マテリアライズドビューの作成
CREATE MATERIALIZED VIEW monthly_sales AS
SELECT
date_trunc('month', created_at) AS month,
product_id,
SUM(amount) AS total_sales,
COUNT(*) AS order_count
FROM orders
GROUP BY month, product_id;
-- 読み取り (事前計算済みなので高速)
SELECT * FROM monthly_sales WHERE month = '2026-03-01';
-- リフレッシュ (最新データで再計算)
REFRESH MATERIALIZED VIEW CONCURRENTLY monthly_sales;
DynamoDB でのマテリアライズドビュー
DynamoDB にはマテリアライズドビューの機能がないが、DynamoDB Streams + Lambda で同等の仕組みを構築できる。
[orders テーブル] → [DynamoDB Streams] → [Lambda] → [monthly_sales テーブル]
リフレッシュ戦略
| 戦略 | 説明 | 用途 |
|---|---|---|
| 完全リフレッシュ | 全データを再計算 | 小〜中規模データ |
| 差分リフレッシュ | 変更分のみ更新 | 大規模データ |
| リアルタイム | イベント駆動で即座に更新 | DynamoDB Streams |
| スケジュール | 定期的に再計算 | 日次/時間ごとの集計 |
使うべきケース
| ✅ 適する | ❌ 適さない |
|---|---|
| 複雑な集計クエリが頻繁に実行される | データの鮮度が最重要 |
| ダッシュボード、レポート | 書き込みが読み取りより多い |
| 読み取り性能が重要 | ストレージコストが問題 |
理論と実装の両面から学ぶなら関連書籍が参考になる。