pg_ivm: Materialized View yang Update Sendiri
Memahami Incremental View Maintenance di PostgreSQL lewat ekstensi pg_ivm — IMMV, create_immv, dan trade-off vs REFRESH penuh.
Masalah materialized view klasik
CREATE MATERIALIZED VIEW report_harian AS
SELECT ... -- query mahal
;
REFRESH MATERIALIZED VIEW report_harian; -- hitung ulang semua
REFRESH menghitung ulang seluruh isi. Aman dan sederhana, tetapi mahal jika:
- Base table besar
- Perubahan per transaksi kecil
- Konsumen butuh data relatif fresh
Ide IVM
Incremental View Maintenance hanya menerapkan delta perubahan ke view, bukan recompute total.
Ekstensi pg_ivm menghadirkan ini di PostgreSQL (13–18) dengan model immediate: update view di AFTER trigger saat base table berubah.
IMMV dalam praktik
CREATE EXTENSION pg_ivm;
-- pastikan shared_preload_libraries / session_preload_libraries memuat 'pg_ivm'
SELECT pgivm.create_immv(
'm',
'SELECT * FROM t0'
);
INSERT INTO t0 VALUES (4);
SELECT * FROM m; -- otomatis memuat baris baru
Bandingkan dengan:
CREATE MATERIALIZED VIEW m AS SELECT * FROM t0;
-- butuh REFRESH manual / job
Detail yang sering terlewat
- Index —
create_immvmencoba membuat unique index otomatis (GROUP BY / DISTINCT / PK). Jika tidak bisa, buat manual agar maintenance efisien. - Preload library — tanpa
pg_ivmdi preload, maintenance bisa tidak benar. - Write amplification — setiap write ke base table memicu kerja trigger; ukur latency write.
- Isolasi transaksi — perhatikan peringatan di
REPEATABLE READ/SERIALIZABLEsaat create; sediakanrefresh_immvdi runbook. - PG 17+ —
search_pathdiubah sementara kepg_catalog, pg_tempsaat maintenance.
Kapan pilih pg_ivm vs cache lain
| Kebutuhan | Opsi |
|---|---|
| Agregasi/report di dalam Postgres, auto-update | pg_ivm |
| Cache hasil query di depan app, wire-compatible | Readyset |
| Snapshot harian / jam-jaman | MV + REFRESH terjadwal |
| Cache ad-hoc di app | Redis (dengan invalidasi disiplin) |
Checklist adopsi
[ ] Extension + preload di staging
[ ] IMMV untuk 1–2 query mahal (bukan semua)
[ ] Index pada IMMV
[ ] Benchmark INSERT/UPDATE base table
[ ] Monitor error trigger & ukuran IMMV
[ ] Dokumentasikan restore_immv untuk disaster recovery
Penutup
pg_ivm mengisi celah antara “view biasa (selalu fresh, selalu mahal)” dan “materialized view (murah dibaca, mahal di-refresh)”. Untuk dashboard dan turunan data yang berubah bertahap, IVM bisa sangat berharga — asal write path tetap diukur.
Dokumentasi ringkas: Knowledge Base — pg_ivm.
Sumber: github.com/sraoss/pg_ivm