PostgreSQLにpg_ivmを導入する

に公開

はじめに

PostgreSQLでマテリアライズドビューを利用する際、データ更新のたびに REFRESH MATERIALIZED VIEW を実行しなければならず、リアルタイム性が求められるシステムでは扱いづらい場面があります。
そこで登場するのが pg_ivm です。pg_ivmを使うことで、ビューを自動的かつインクリメンタルに更新できるようになります。

この記事では、pg_ivmの概要と導入手順、さらに簡単なTipsを紹介します。

pg_ivmとは

pg_ivm (Incremental View Maintenance for PostgreSQL) は、マテリアライズドビューを自動的に更新するための拡張機能です。

通常のマテリアライズドビューでは、次のような課題があります:

  • REFRESH MATERIALIZED VIEW を手動で実行しないと最新化されない
  • REFRESH は全件再計算のためコストが高い

pg_ivmを導入すると、ビューを インクリメンタルに更新 できるようになります。つまり、基盤テーブルの INSERT / UPDATE / DELETE が発生すると、その差分のみが反映される仕組みです。

利点

  • 最新データを即時に参照できる
  • 更新コストが低減する
  • リアルタイム性が求められるダッシュボードや分析系に有効

導入手順

事前準備

導入において使用するコマンドが使えるように準備します。

sudo yum install postgresql-devel
sudo yum install gcc make

extensionの導入

まずはpg_ivmをPostgreSQLにインストールします。

# ソースコード取得
git clone https://github.com/sraoss/pg_ivm.git
cd pg_ivm
# ビルド & インストール
make
make install

pg_ivmの有効化

インストール後、PostgreSQLに接続してextensionを有効化します。

# 必要に応じてユーザーを切り替え
su - posgre
# データベースに接続
psql -d mydb
# 拡張機能を有効化
CREATE EXTENSION pg_ivm;

これでpg_ivmが利用可能になります。

Incremental View Maintenanceの作成

CREATE INCREMENTAL MATERIALIZED VIEW mv_sales AS
SELECT product_id, SUM(amount) AS total_amount
FROM sales
GROUP BY product_id;

このビューは sales テーブルの更新に応じて、自動的に差分更新されます。
例えば以下のようにデータを追加すると…

INSERT INTO sales VALUES (101, 500);

mv_sales には即時に反映されます。REFRESH は不要です。

Tips

  • 対応していないクエリ: pg_ivmはすべてのSQL構文をサポートしているわけではありません(例:ウィンドウ関数など)。
  • インデックス: ビューに対してインデックスを作成することで、検索性能をさらに高められます。
  • 本番導入の注意: 差分更新の仕組み上、トリガーや内部ロジックが追加されるため、パフォーマンス検証は必須です。

最後に

pg_ivmを導入することで、PostgreSQLのマテリアライズドビューがより実用的になり、リアルタイムに近い分析や参照が可能となります。
BIツールやレポート基盤で最新データを扱いたい場合に、非常に有効な手段です。

Discussion