🐕🦺
PostgreSQL にマテリアライズドビューを作成する
はじめに
マテリアライズドビューとは、SQLのSELECT結果を物理的に保存(キャッシュ)しておく特殊なビュー(仮想テーブル)です。
ビューとマテリアライズドビューの違い
違いの一覧表
| 特徴 | 通常のビュー(View) | マテリアライズドビュー(Materialized View) |
|---|---|---|
| データの保存 | 保存されない(都度クエリ実行) | 保存される(物理的に保存) |
| パフォーマンス | 遅い(毎回実行) | 速い(保存された結果を参照) |
| 最新性 | 常に最新のデータ | 作成・リフレッシュ時点のデータ |
| 更新 | 自動反映 | 明示的に REFRESH MATERIALIZED VIEW が必要 |
| 書き込み | 不可 | 不可(基本は読み取り専用) |
| インデックス | 作成不可 | 作成可能(パフォーマンス向上に有効) |
詳細説明
通常のビュー(View)
- 定義のみを持つ仮想テーブル。
- CREATE VIEW で定義し、SELECT文をカプセル化。
- データベースにクエリだけが保存され、アクセス時にその都度実行される。
メリット:
- 常に最新のデータが見られる。
- ストレージを消費しない。
デメリット:
- 複雑なクエリの場合、都度実行なのでパフォーマンスに難あり。
マテリアライズドビュー(Materialized View)
- SELECT文の結果を実体として保存したテーブルのようなもの。
- CREATE MATERIALIZED VIEW で作成。
- 一度作成(またはリフレッシュ)した時点のデータが格納される。
メリット:
- 重いクエリの結果を保存でき、読み取りが非常に高速。
- インデックスも貼れる。
デメリット:
- データが古くなる可能性がある。
- 最新状態に保つには REFRESH MATERIALIZED VIEW を手動またはスケジュールで実行する必要がある。
どちらを使うべきか
| シチュエーション | おすすめ |
|---|---|
| 常に最新データが必要 | 通常のビュー |
| 重い集計処理や頻繁な参照がある | マテリアライズドビュー |
| データが頻繁に変わらない or 一定間隔で更新されれば十分 | マテリアライズドビュー |
マテリアライズドビューを作成する
下記はサンプルです
CREATE MATERIALIZED VIEW sales_summary_mv AS
SELECT product_id, SUM(amount) AS total_sales
FROM sales
GROUP BY product_id;
マテリアライズドビューを定期リフレッシュさせる
下記はサンプルです
SELECT cron.schedule(
'refresh_mv_sales_summary_hourly', -- ジョブ名(任意)
'0 * * * *', -- cron式(毎時)
$$REFRESH MATERIALIZED VIEW sales_summary_mv;$$ -- 実行SQL
);
cron形式の指定方法
| 曜日 | 時間 | cron式 | 説明 |
|---|---|---|---|
| 毎分 | 毎分 | * * * * * |
毎分実行 |
| 毎時 | 0分 | 0 * * * * |
毎時0分に実行 |
| 毎日 | 3:00 | 0 3 * * * |
毎朝3時に実行 |
| 毎週月曜 | 2:30 | 30 2 * * 1 |
毎週月曜2:30に実行 |
Discussion