pg_ivm — Incremental View Maintenance
Dokumentasi ringkas ekstensi pg_ivm: materialized view yang di-update inkremental (IMMV) di PostgreSQL 13–18.
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
- Install extension + preload libraries
- Buat IMMV dengan query yang jelas & index-friendly
- Pastikan index di IMMV (otomatis atau manual)
- Uji write path: latency INSERT/UPDATE/DELETE base table
- Monitor bloat & trigger errors
- Dokumentasikan cara restore (
restore_immv) di runbook
Tautan
- Repo: https://github.com/sraoss/pg_ivm
- Bandingkan dengan cache layer eksternal (mis. Readyset) jika kebutuhan lebih ke query caching app-facing