マテリアライズドビュー
ビューの結果を実体として保存し、高速に参照できる仕組みです。通常のビューとの違い、リフレッシュによる更新、向き不向きを解説します。
- 1.マテリアライズドビューはビューの結果を実体(テーブル)として保存し、参照を高速化する仕組み。
- 2.通常のビューは参照のたびに毎回計算するが、こちらは計算済みの結果を読むだけで速い。
- 3.結果は自動では最新化されず、リフレッシュで更新する。鮮度より速度を取る集計・レポートに向く。
マテリアライズドビューとは
複雑な集計クエリ(多数の結合や GROUP BY を含むもの)は、実行のたびに時間がかかります。ダッシュボードの数値のように 何度も同じ重い結果を参照する 場面では、毎回計算し直すのは無駄です。
マテリアライズドビュー(実体化ビュー) は、クエリの 結果そのものをテーブルのように保存 しておき、参照時はその保存済みデータを読むだけで済ませる仕組みです。「materialize(実体化する)」の名の通り、計算結果に実体を持たせるのがポイントです。
-- 日別の売上集計を実体化して保持する
CREATE MATERIALIZED VIEW daily_sales AS
SELECT date_trunc('day', created_at) AS day,
SUM(amount) AS total
FROM orders
GROUP BY 1;
以後、SELECT * FROM daily_sales; は集計を走らせず、保存済みの結果を即座に返します。
通常のビューとの違い
名前は似ていますが、通常のビュー と マテリアライズドビュー は中身が大きく異なります。通常のビューは「保存された SELECT 文(名前を付けた問い合わせ)」にすぎず、データは持ちません。参照するたびに元の SQL がその場で実行されます。
| 観点 | 通常のビュー | マテリアライズドビュー |
|---|---|---|
| 実体(データ) | 持たない(定義だけ) | 結果をテーブルとして保持 |
| 参照時の処理 | 毎回クエリを実行 | 保存済みの結果を読むだけ |
| 速度 | 元クエリ次第(重いと遅い) | 速い(計算済み) |
| データの鮮度 | 常に最新 | リフレッシュした時点のもの |
| 容量 | ほぼ消費しない | 結果ぶんのディスクを使う |
つまり、通常のビューは 常に最新だが毎回計算が走る、マテリアライズドビューは 速いが鮮度はリフレッシュ時点 という、速度と鮮度のトレードオフになっています。
リアルタイムの正確さが必要な処理(残高や在庫の確定値など)は、常に最新を返す通常のビューやテーブル直接参照が向きます。一方、多少古くても許容でき、とにかく速く返したい集計(前日までの売上推移、利用統計など)はマテリアライズドビューの出番です。「この画面は何分前のデータまで許せるか」を起点に選ぶと迷いません。
リフレッシュ(更新)
マテリアライズドビューは保存済みのスナップショットなので、元のテーブルが変わっても 自動では最新になりません。最新の結果に作り直す操作が リフレッシュ です。
-- 集計をやり直して内容を最新化する
REFRESH MATERIALIZED VIEW daily_sales;
リフレッシュには主に 2 つの考え方があります。
- 完全リフレッシュ: 元クエリをまるごと再実行して全件作り直す。単純だが、重い集計だとそれ自体に時間がかかる。
- 増分リフレッシュ: 前回以降に変わったぶんだけを反映する。速いが、DB 製品によって対応状況や条件が異なる。
更新のタイミングも設計事項です。夜間バッチで 1 日 1 回、数分おきにスケジュール実行、元テーブル更新を起点に走らせる、など要件に応じて選びます。
素朴な REFRESH MATERIALIZED VIEW は、処理中そのビューへの参照をブロックする場合があります。利用者がいる時間帯に重い完全リフレッシュをかけると、画面が固まったように見えることがあります。PostgreSQL の CONCURRENTLY オプションのように、参照を止めずに更新できる仕組みや、負荷の低い時間帯への割り当てを検討しましょう。なお、表示しているデータが「いつ時点のものか」をユーザーに示しておくと、鮮度の誤解も防げます。
向いている場面
マテリアライズドビューが効くのは、おおむね次のような条件がそろうときです。
- 集計や結合が 重く、実行に時間がかかる。
- 同じ結果を 何度も参照 する(書き込みより読み取りが多い)。
- 結果が 多少古くても許容 できる。
| 向いている例 | 向かない例 |
|---|---|
| 日次・月次の売上レポート | 残高や在庫の確定値など即時性が要るもの |
| 利用統計ダッシュボード | 1 回しか使わない使い捨ての集計 |
| 重い結合の結果の再利用 | 元データが秒単位で変わり続ける指標 |
マテリアライズドビューは「重い計算を一度だけ行い、結果を使い回す」ための道具です。鮮度を少し諦める代わりに参照を劇的に速くできるので、レポートや集計ダッシュボードのように 読みが多く即時性が低い 用途で特に威力を発揮します。
データベース Article
マテリアライズドビューを実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
マテリアライズドビュー
比較で見る軸
難易度: intermediate / カテゴリ: データベース / タグ数: 3
導入後に効く点
通常のビューは参照のたびに毎回計算するが、こちらは計算済みの結果を読むだけで速い。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- intermediate
- カテゴリ
- データベース
- タグ数
- 3
判断チェックリスト
- 自社の用途が「マテリアライズドビュー / ビュー」に近いか確認する。
- 強みである「マテリアライズドビューはビューの結果を実体(テーブル)として保存し、参照を高速化する仕組み。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。