A
PostgreSQL

pg_ivm — Incremental View Maintenance

Dokumentasi ringkas ekstensi pg_ivm: materialized view yang di-update inkremental (IMMV) di PostgreSQL 13–18.

#PostgreSQL#Performance#Extensions#Architecture

Apa itu pg_ivm?

pg_ivm adalah ekstensi PostgreSQL yang menyediakan Incremental View Maintenance (IVM).

Alih-alih menghitung ulang seluruh isi view (REFRESH MATERIALIZED VIEW), IVM hanya menghitung dan menerapkan perubahan inkremental.

Sumber: sraoss/pg_ivm

Kompatibel: PostgreSQL 13, 14, 15, 16, 17, 18.

IMMV vs Materialized View biasa

Materialized View IMMV (pg_ivm)
Update Full recompute (REFRESH) Inkremental otomatis
Timing Manual / scheduled Immediate (AFTER trigger)
Buat CREATE MATERIALIZED VIEW pgivm.create_immv(...)
Cocok untuk Snapshot periodik Data yang berubah sedikit-sedikit

Immediate vs deferred maintenance

  • Immediate — view di-update dalam transaksi yang sama saat base table berubah (pendekatan pg_ivm)
  • Deferred — update belakangan (saat akses, REFRESH, atau job background)

pg_ivm menggunakan immediate maintenance via AFTER triggers.

Install

make install
# set PG_CONFIG jika PostgreSQL non-default
# make PG_CONFIG=/path/to/pg_config install
CREATE EXTENSION pg_ivm;

Preload library (penting)

Agar maintenance benar, tambahkan di postgresql.conf:

shared_preload_libraries = 'pg_ivm'
# atau
session_preload_libraries = 'pg_ivm'

Lalu restart PostgreSQL.

RPM tersedia di PostgreSQL yum repository.

Membuat IMMV

SELECT pgivm.create_immv('myview', 'SELECT * FROM mytab');

Setara konsepnya dengan:

CREATE MATERIALIZED VIEW myview AS SELECT * FROM mytab;

Contoh perilaku:

SELECT pgivm.create_immv('m', 'SELECT * FROM t0');
INSERT INTO t0 VALUES (4);
SELECT * FROM m;  -- otomatis ter-update

Index otomatis

Saat create, index unik dicoba dibuat jika memungkinkan:

  • Ada GROUP BY → index di kolom GROUP BY
  • Ada DISTINCT → index di target list
  • Atau target list memuat semua PK base table

Jika tidak memungkinkan, muncul NOTICE agar Anda buat index manual.

Fungsi penting

create_immv(immv, view_definition) → bigint

Membuat IMMV + trigger + metadata. Return: jumlah baris.

Catatan isolasi: di REPEATABLE READ / SERIALIZABLE bisa ada warning inkonsistensi concurrent; disarankan READ COMMITTED atau jalankan refresh_immv setelahnya.

refresh_immv(immv, with_data default true) → bigint

Full refresh (mirip REFRESH MATERIALIZED VIEW).

restore_immv(immv, view_definition, populate default false)

Pulihkan metadata/trigger untuk tabel IMMV yang sudah ada (mis. setelah restore backup).

PostgreSQL 17+

Selama automatic maintenance / create_immv, search_path sementara diubah ke pg_catalog, pg_temp.

Kapan memakai pg_ivm?

  • Dashboard / report yang sering dibaca, base table jarang berubah besar
  • Ingin hasil “hampir real-time” tanpa refresh penuh
  • Agregasi / join yang mahal jika dihitung ulang

Kapan tidak ideal?

  • Base table sangat write-heavy (trigger cost tinggi)
  • Query view sangat kompleks / di luar kemampuan IVM ekstensi
  • Cukup dengan MV + refresh terjadwal (lebih sederhana)

Checklist produksi

  1. Install extension + preload libraries
  2. Buat IMMV dengan query yang jelas & index-friendly
  3. Pastikan index di IMMV (otomatis atau manual)
  4. Uji write path: latency INSERT/UPDATE/DELETE base table
  5. Monitor bloat & trigger errors
  6. Dokumentasikan cara restore (restore_immv) di runbook

Tautan