🐕‍🦺

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