Azure Database for PostgreSQLでpg_ivmが一般提供|変更点と管理者・開発者の確認事項

2026年6月3日に公開または更新された今回のポイントは、Azure Database for PostgreSQL フレキシブル サーバーで pg_ivm 拡張機能を利用できるようになったことです。pg_ivm は、PostgreSQL のマテリアライズドビューを差分更新しやすくする拡張機能で、ダッシュボード、集計レポート、SaaSの利用状況分析など「読み取りは速くしたいが、データの鮮度も落としたくない」場面で効果を期待できます。

ただし、これは Azure SQL Database や Azure SQL Managed Instance のAI/Copilot機能追加ではありません。実際の対象は Azure Database for PostgreSQL flexible server です。既存環境で使うには、サーバーパラメーターの許可リスト、shared_preload_libraries、対象データベースでの CREATE EXTENSION、書き込み性能への影響確認が必要です。Azure Updatesでは該当更新が「Launched」として掲載され、Azureの更新ページでは Launched が本番利用可能な状態を示す区分として説明されています。(Microsoft Azure)

目次

Azure SQLの更新として見る前に:対象はAzure Database for PostgreSQL

今回の更新名は「Generally Available: Azure Database for PostgreSQL flexible server pg_ivm extension」です。つまり、対象サービスは Azure Database for PostgreSQL フレキシブル サーバー です。

Azure関連の更新をまとめて追っていると、Azure SQL、Azure Database for PostgreSQL、Azure Cosmos DB、Azure Database for MySQLなどが同じ「データベース系アップデート」として並ぶことがあります。しかし、今回の pg_ivm は PostgreSQL 拡張機能であり、T-SQLを使う Azure SQL Database には直接関係しません。

確認項目内容実務上の見方
対象サービスAzure Database for PostgreSQL フレキシブル サーバーAzure SQL Database/Managed Instanceではない
機能pg_ivm 拡張機能の一般提供PostgreSQLの拡張機能として有効化して使う
主な用途マテリアライズドビューの差分更新集計・分析・参照性能の改善候補
自動適用されない管理者が設定し、DBごとにインストールする
注意点書き込み時のオーバーヘッド、SQL定義の制約、再起動本番適用前に検証が必須

Microsoft Learnの拡張機能一覧では、pg_ivm は PostgreSQL向けの Incremental View Maintenance、つまり差分ビューメンテナンス機能を提供する拡張機能として掲載されています。確認時点では PostgreSQL 13〜18 で pg_ivm 1.13 がサポートされ、PostgreSQL 11/12 はサポート対象外です。また、該当ライブラリを shared_preload_libraries で有効化する必要があるとされています。(Microsoft Learn)

pg_ivmとは何か

pg_ivm は、PostgreSQLで Incrementally Maintainable Materialized View、略してIMMV を作成するための拡張機能です。

通常のマテリアライズドビューは、重い集計や結合の結果をあらかじめ保存しておくことで、読み取りを高速化できます。一方で、元テーブルが更新されても自動では最新化されないため、REFRESH MATERIALIZED VIEW の実行タイミングを設計しなければなりません。データ量が大きい場合、更新処理に時間がかかり、レポートの鮮度や運用負荷が問題になります。

pg_ivm はこの課題に対し、元テーブルの変更に応じてビュー側を差分更新する仕組みを提供します。pg_ivm の説明では、REFRESH MATERIALIZED VIEW のように全体を再計算するのではなく、変更分をビューに適用する方式であり、元テーブルが変更された同じトランザクション内でトリガーによりIMMVを更新すると説明されています。(GitHub)

比較項目通常のマテリアライズドビューpg_ivmによるIMMV
最新化方法REFRESH MATERIALIZED VIEW で再計算元テーブル変更時に差分更新
データ鮮度更新間隔に依存より最新に近い状態を保ちやすい
読み取り性能高速化しやすい高速化しやすい
書き込み性能元テーブル更新は比較的軽いトリガー更新分の負荷が増える
向く処理定期更新のレポート、夜間バッチ小さな差分更新が多いダッシュボード
向かない処理鮮度が重要な集計には弱い大量更新・高頻度更新では逆効果になり得る

重要なのは、pg_ivm は「常に速くなる魔法の機能」ではないことです。読み取りの鮮度と速度を改善する代わりに、元テーブルへの INSERT、UPDATE、DELETE 時にIMMVを維持する処理が追加されます。そのため、参照が多く、更新差分が小さい集計では有効ですが、更新が非常に多いテーブルや大量ロードを頻繁に行うテーブルでは慎重に判断する必要があります。

何が変わったのか

今回の変更で、Azure Database for PostgreSQL フレキシブル サーバーの利用者は、Azure上のマネージドPostgreSQL環境で pg_ivm 拡張機能をインストールできるようになりました。

これまでは、pg_ivm を使いたい場合に、自己管理のPostgreSQL環境や別の構成を検討する必要があるケースがありました。一般提供により、AzureのフルマネージドPostgreSQLを使いながら、差分更新型のマテリアライズドビューを設計候補に入れやすくなります。

ただし、次の点は誤解しないようにしてください。

  • 既存のマテリアライズドビューが自動でIMMVに変換されるわけではない
  • 既存サーバーで自動的に pg_ivm が有効になるわけではない
  • Azure SQL Database向けの機能ではない
  • CopilotやAI支援機能の追加ではない
  • すべてのSQL定義でIMMVを作成できるわけではない

つまり、今回の更新は「使える選択肢が増えた」という意味です。実際に採用するかどうかは、対象クエリ、更新頻度、読み取り要件、移行方式を確認して判断する必要があります。

影響を受けるシステム

今回の更新を確認すべきなのは、主に次のようなAzure Database for PostgreSQL利用環境です。

システムの特徴pg_ivmを検討する価値確認すべき点
BIダッシュボードで集計クエリが重い高い集計対象テーブルの更新頻度とビュー定義
SaaSの利用量、請求、アクティビティを日次・時間別に集計している高いテナントIDや日付単位で一意に集計できるか
商品カタログ、在庫、検索補助データを参照用に集約している中〜高更新時の遅延が許容範囲か
夜間バッチで十分なレポート低〜中通常のマテリアライズドビュー更新で足りる可能性
大量インポートや一括更新が頻繁低いIMMV維持コストが大きくなる可能性
Azure SQL Databaseを利用している対象外PostgreSQL向け更新のため直接影響なし

特に確認したいのは、「今すでに REFRESH MATERIALIZED VIEW が遅い」「更新直後のデータがレポートに反映されない」「集計専用テーブルをアプリ側やバッチで頑張って更新している」といった環境です。

一方で、書き込み性能が最重要のOLTPテーブルに安易に導入すると、更新処理のたびにIMMV更新が走り、かえってレスポンスやロック待ちの問題を増やすおそれがあります。

管理者が確認すべき設定

Azure Database for PostgreSQL フレキシブル サーバーで拡張機能を使うには、単にSQLで CREATE EXTENSION を実行するだけでは足りない場合があります。Microsoft Learnでは、拡張機能を作成する前に許可リストへ追加する必要があること、azure.extensions パラメーターで許可すること、必要な場合は shared_preload_libraries に追加すること、さらに利用する各データベースで CREATE EXTENSION を実行することが説明されています。(Microsoft Learn)

PostgreSQLバージョンを確認する

まず、対象サーバーのPostgreSQLバージョンを確認します。

SHOW server_version;

確認時点のMicrosoft Learnでは、pg_ivm は PostgreSQL 13〜18 に対応し、11/12はサポート対象外です。古いPostgreSQLバージョンを使っている場合は、pg_ivmの検証前にバージョンアップ計画を立てる必要があります。(Microsoft Learn)

利用可能な拡張機能を確認する

Azure Database for PostgreSQL フレキシブル サーバーでは、サポートされる拡張機能の一覧を次のように確認できます。

SHOW azure.extensions;

本番環境では、ドキュメントの表だけで判断せず、実際の対象サーバーでも確認してください。リージョン、PostgreSQLバージョン、サービス更新の反映タイミングにより、利用可否を現物で確認することが重要です。

azure.extensionsにpg_ivmを追加する

Azure portalでは、対象の Azure Database for PostgreSQL フレキシブル サーバーを開き、サーバーパラメーターから azure.extensions を確認します。pg_ivm を許可リストに追加して保存します。

Azure CLIを使う場合は、既存の値を上書きしないように注意してください。

az postgres flexible-server parameter set \
  --resource-group <resource_group> \
  --server-name <server_name> \
  --subscription <subscription_id> \
  --name azure.extensions \
  --value pg_ivm,<existing_extension>

--value に指定した値が現在の設定として保存されるため、すでに pg_stat_statements、pg_cron、postgis などを許可している場合は、既存値を含めて指定します。ここを雑に変更すると、別の拡張機能を使う運用やリストア処理に影響する可能性があります。

shared_preload_librariesにpg_ivmを追加する

pg_ivm は shared_preload_libraries 側の設定も確認が必要です。Microsoft Learnの拡張機能一覧では、pg_ivm に対して対応ライブラリを shared_preload_libraries で有効にする必要があることが示されています。(Microsoft Learn)

az postgres flexible-server parameter set \
  --resource-group <resource_group> \
  --server-name <server_name> \
  --subscription <subscription_id> \
  --name shared_preload_libraries \
  --value pg_ivm,<existing_library>

この設定も既存値の扱いに注意してください。pg_stat_statements など、既に読み込まれているライブラリがある場合は消さないようにします。

shared_preload_libraries はサーバー起動時に読み込まれるライブラリを決めるパラメーターです。一般にこの種の変更は再起動を伴うため、本番環境ではメンテナンス時間、接続再試行、アプリケーション側のタイムアウト設定を事前に確認してから実施します。pg_ivm側の説明でも、shared_preload_libraries または session_preload_libraries に追加し、設定反映にはPostgreSQLの再起動が必要とされています。(GitHub)

対象データベースでCREATE EXTENSIONを実行する

サーバーレベルの設定後、利用するデータベースごとに拡張機能を作成します。

CREATE EXTENSION IF NOT EXISTS pg_ivm;

Microsoft Learnでは、拡張機能を作成するユーザーは azure_pg_admin ロールのメンバーである必要があると説明されています。権限不足のユーザーで実行すると、検証環境では成功したのに本番では失敗する、という展開ミスが起きやすいため、実行ユーザーを手順書に明記しておきましょう。(Microsoft Learn)

インストール後は、次のSQLで確認できます。

SELECT extname, extversion
FROM pg_extension
WHERE extname = 'pg_ivm';

開発者が押さえるべき設計ポイント

pg_ivm を使う場合、開発者は「どのビューをIMMV化するか」を慎重に選ぶ必要があります。通常のビューやマテリアライズドビューと同じ感覚で、複雑なSQLをそのまま置き換えられるとは限りません。

IMMVの作成例

たとえば、注文テーブルからテナント別・日別の集計を作る場合は、次のような形で検証できます。

CREATE EXTENSION IF NOT EXISTS pg_ivm;

SELECT pgivm.create_immv(
  'daily_order_summary_immv',
  $$
  SELECT
    tenant_id,
    order_date,
    count(*) AS order_count,
    sum(amount) AS total_amount
  FROM orders
  GROUP BY tenant_id, order_date
  $$
);

作成後、元テーブルにデータを追加すると、IMMV側も差分更新されます。

INSERT INTO orders (tenant_id, order_date, amount)
VALUES (1, CURRENT_DATE, 1000);

SELECT *
FROM daily_order_summary_immv
WHERE tenant_id = 1
  AND order_date = CURRENT_DATE;

この例では、tenant_id と order_date が集計単位です。実務では、この集計キーで効率よく検索できるか、IMMV側に適切なインデックスがあるかを必ず確認してください。

SELECT indexname, indexdef
FROM pg_indexes
WHERE tablename = 'daily_order_summary_immv';

pg_ivm の説明では、IMMV更新を効率化するには適切なインデックスが必要であり、条件によっては create_immv がユニークインデックスを自動作成します。ただし、自動作成できないケースではインデックスが作成されず、更新に時間がかかる可能性があります。(GitHub)

使えるSQL定義には制約がある

pg_ivm は多くの集計や結合に対応しますが、すべてのSQLを許容するわけではありません。公式READMEでは、内部結合、外部結合、DISTINCT、一部の集計関数、単純なサブクエリ、単純なCTEなどがサポート対象として挙げられる一方、ウィンドウ関数、HAVING、ORDER BY、LIMIT/OFFSET、UNION/INTERSECT/EXCEPT、DISTINCT ON などはビュー定義に使えないと説明されています。また、ベーステーブルは単純なテーブルである必要があり、ビュー、マテリアライズドビュー、パーティションテーブル、外部テーブルなどは使用できないとされています。(GitHub)

実務では、既存のレポートSQLをそのままIMMV化しようとして失敗することがあります。最初は、次のような単純な集計から検証すると安全です。

SELECT
  customer_id,
  count(*) AS order_count,
  sum(total_amount) AS total_amount
FROM orders
GROUP BY customer_id;

反対に、次のようなクエリは事前確認が必要です。

SELECT
  customer_id,
  sum(total_amount) AS total_amount,
  rank() OVER (ORDER BY sum(total_amount) DESC) AS sales_rank
FROM orders
GROUP BY customer_id;

ウィンドウ関数を含むランキング処理は、IMMVの定義ではなく、IMMVを参照する通常のSELECT側で行う構成に分けるほうが現実的です。

書き込み負荷を必ず測る

pg_ivm は読み取り側の鮮度と速度に効く一方、元テーブル更新時に追加処理が発生します。pg_ivm の説明でも、IMMVは通常の REFRESH MATERIALIZED VIEW より効率的に更新できる場合がある一方、元テーブルの更新はトリガーが呼び出されるため遅くなるとされています。(GitHub)

検証では、読み取りだけでなく、次のような書き込み操作を必ず測定します。

  • 1件ずつの INSERT
  • ピーク時の連続 UPDATE
  • バッチによる大量 INSERT
  • 削除や論理削除の更新
  • 同一集計キーに集中する更新
  • 複数テナントが同時に更新するケース

特に、同じ集計行に更新が集中する場合はロック待ちが発生しやすくなります。pg_ivm では、同時トランザクション時のIMMV更新は基本的に順次処理され、条件によっては ExclusiveLock が保持されることが説明されています。(GitHub)

集計の型にも注意する

金額、ポイント、利用量などの集計では、数値型の選び方も重要です。pg_ivm の説明では、real や double precision に対する sum や avg は精度の制約により、元テーブルから計算した結果と差が出る可能性があるため、回避策として numeric 型の利用が示されています。(GitHub)

請求金額や会計に近いデータで double precision を使っている場合は、IMMV導入の前に型設計から見直してください。

導入に向いているケース、向かないケース

pg_ivm は、次のようなケースで検討しやすい機能です。

判断軸向いているケース向かないケース
データ更新量小さな差分更新が中心大量ロードや一括更新が頻繁
読み取り要件常に近い鮮度の集計を見たい数時間遅れでも問題ない
クエリ構造単純な集計、結合、グループ化複雑な分析SQL、ウィンドウ関数、ランキング
性能課題REFRESH MATERIALIZED VIEW が重い元テーブル更新の遅延が許容できない
運用体制パラメーター変更・再起動・検証を管理できるDB設定を変更しにくい、本番検証が難しい

採用候補になりやすいのは、次のような処理です。

  • 管理画面のリアルタイムに近い集計
  • テナント別・日別・商品別の利用状況集計
  • 注文、在庫、課金、ログイン履歴のサマリー
  • 重い集計クエリを何度も実行しているレポート画面
  • 夜間更新では鮮度が足りないBI用途

一方、次のような場合は、通常のマテリアライズドビュー、集計テーブル、ETL、キャッシュ、検索エンジン、データウェアハウスの利用を比較したほうがよいでしょう。

  • 毎秒大量の書き込みがある
  • バッチで数十万〜数百万行を更新する
  • レポートは1日1回更新で十分
  • 既存SQLが複雑でIMMV制約に合わない
  • 書き込み遅延をほとんど増やせない

pg_ivm の説明でも、IMMVを最新に保ちたい場合や元テーブルの変更が小さい場合に有効であり、頻繁な更新や大量変更では維持コストが通常の再計算より大きくなる可能性があるとされています。(GitHub)

移行・展開時の注意点

既存のマテリアライズドビューを置き換える前に並行稼働する

既存の CREATE MATERIALIZED VIEW をいきなり廃止するのではなく、まずIMMVを別名で作成し、結果の一致と性能を比較します。

-- 既存
SELECT *
FROM daily_order_summary_mv
WHERE tenant_id = 1;

-- 新規IMMV
SELECT *
FROM daily_order_summary_immv
WHERE tenant_id = 1;

比較すべき項目は、件数、合計値、NULLの扱い、丸め誤差、更新直後の反映、ピーク時の更新遅延です。特に金額集計や課金処理では、1円単位の差分も障害扱いになるため、結果比較を自動化してから本番切り替えに進みます。

パラメーター変更はIaCにも反映する

Azure portalで手動設定しただけでは、将来の再構築、DR環境、ステージング環境で設定漏れが起きやすくなります。Bicep、ARMテンプレート、Terraform、Azure CLIスクリプトなどでサーバーパラメーターを管理している場合は、次の2つを構成管理に含めます。

  • azure.extensions
  • shared_preload_libraries

既存値を保持しながら追加する方針も、コードレビューで確認できる形にしておきます。

バックアップ・リストア・アップグレードを検証する

pg_ivm のREADMEでは、pg_dump バックアップからのリストア後や pg_upgrade 後には、すべてのIMMVを手動で削除して再作成する必要があると説明されています。(GitHub)

Azure Database for PostgreSQLの運用でも、次の作業は必ず事前検証に含めてください。

  • pg_dump / pg_restore を使う移行
  • ステージング環境への復元
  • メジャーバージョンアップ
  • リージョン移行
  • 災害対策環境の再構築
  • CI/CDでのスキーマ再作成

リストア先で pg_ivm が許可リストに入っていない、shared_preload_libraries が未設定、対象DBに CREATE EXTENSION されていない、といった状態では復元やアプリ起動時にエラーになる可能性があります。

Row Level Securityを使う環境では再更新を計画する

Row Level Security、いわゆるRLSを使っている環境も注意が必要です。pg_ivm の説明では、ベーステーブルにRLSポリシーがある場合、IMMV所有者から見えない行は結果から除外され、ポリシーを後から変更した場合は新しいポリシーが既存のビュー内容に反映されないため、IMMVのリフレッシュまたは再作成が必要とされています。(GitHub)

マルチテナントSaaSでRLSを使っている場合は、IMMVの所有者、参照権限、ポリシー変更時の再作成手順をセットで設計してください。

本番導入前のチェックリスト

本番導入では、次の順番で確認すると失敗を減らせます。

手順確認内容失敗しやすいポイント
1対象がAzure Database for PostgreSQL flexible serverか確認Azure SQL向け更新と誤解する
2PostgreSQLバージョンを確認11/12など非対応バージョンを見落とす
3SHOW azure.extensions; で利用可否を確認ドキュメントだけ見て環境確認を省く
4azure.extensions に pg_ivm を追加既存の許可拡張を上書きして消す
5shared_preload_libraries に追加既存ライブラリを消す、再起動を忘れる
6各DBで CREATE EXTENSION を実行サーバー設定だけで使えると思い込む
7IMMV定義を検証既存SQLが制約に合わない
8読み取り性能を比較速くなった部分だけ見て判断する
9書き込み性能を比較トリガー維持コストを見落とす
10リストア・アップグレード手順を検証復旧時にIMMV再作成が漏れる

検証時は、少なくとも次のメトリクスを取得しておくと判断しやすくなります。

EXPLAIN (ANALYZE, BUFFERS)
SELECT *
FROM daily_order_summary_immv
WHERE tenant_id = 1;
EXPLAIN (ANALYZE, BUFFERS)
UPDATE orders
SET amount = amount + 100
WHERE id = 12345;

読み取りだけでなく、更新SQLの実行時間、ロック待ち、CPU、IOPS、接続数、アプリケーションのタイムアウトも合わせて確認します。pg_stat_statements を使っている環境では、導入前後のクエリ時間を比較すると効果を説明しやすくなります。

管理者と開発者が次にやるべきこと

今回の pg_ivm 一般提供は、Azure Database for PostgreSQL フレキシブル サーバーで集計・分析系の設計選択肢を広げる更新です。特に、重い集計クエリを定期的に再計算している環境や、ダッシュボードの鮮度に課題がある環境では、検証する価値があります。

一方で、pg_ivm は自動で有効になる機能ではなく、すべてのワークロードに向くわけでもありません。管理者は azure.extensions、shared_preload_libraries、再起動、権限、リストア手順を確認し、開発者はIMMVに向くクエリか、書き込み性能に悪影響が出ないかを検証する必要があります。

まずは本番の代表的なマテリアライズドビューを1つ選び、ステージング環境で同じデータ量・同じ更新パターンを使って比較してください。読み取りが速くなっても、書き込み遅延やロック待ちが増えるなら、通常のマテリアライズドビュー、集計テーブル、バッチ更新、キャッシュと比較して、運用全体で最も安定する方法を選ぶことが重要です。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次