A

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.

2 menit bacaAhmad Apandi

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

  1. Indexcreate_immv mencoba membuat unique index otomatis (GROUP BY / DISTINCT / PK). Jika tidak bisa, buat manual agar maintenance efisien.
  2. Preload library — tanpa pg_ivm di preload, maintenance bisa tidak benar.
  3. Write amplification — setiap write ke base table memicu kerja trigger; ukur latency write.
  4. Isolasi transaksi — perhatikan peringatan di REPEATABLE READ / SERIALIZABLE saat create; sediakan refresh_immv di runbook.
  5. PG 17+search_path diubah sementara ke pg_catalog, pg_temp saat 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

Artikel terkait