Update materialized_view_postgresql.MD

This commit is contained in:
mbahsomo 2025-12-31 13:35:17 +00:00
parent 2471d39134
commit 4c269a93a0
1 changed files with 185 additions and 16 deletions

View File

@ -1,5 +1,3 @@
Ya, **PostgreSQL memiliki fitur *Materialized View***.
### Apa itu Materialized View di PostgreSQL? ### Apa itu Materialized View di PostgreSQL?
**Materialized View** adalah objek database yang **menyimpan hasil query secara fisik** (seperti tabel), bukan menjalankan ulang query setiap kali dipanggil seperti *VIEW* biasa. **Materialized View** adalah objek database yang **menyimpan hasil query secara fisik** (seperti tabel), bukan menjalankan ulang query setiap kali dipanggil seperti *VIEW* biasa.
@ -63,15 +61,6 @@ REFRESH MATERIALIZED VIEW CONCURRENTLY laporan_penjualan;
* Perlu mekanisme **refresh manual / cron** * Perlu mekanisme **refresh manual / cron**
* Memakai **storage tambahan** * Memakai **storage tambahan**
---
Kalau mau, saya bisa jelaskan:
* 🔁 cara auto-refresh pakai **cron / pg_cron**
* ⚡ strategi performa (index materialized view)
* 🆚 kapan pilih materialized view vs table biasa
Tinggal bilang mau fokus ke yang mana.
Berikut **strategi performa Materialized View di PostgreSQL (fokus INDEX & refresh)** yang sudah terbukti efektif untuk kasus laporan & query berat. Berikut **strategi performa Materialized View di PostgreSQL (fokus INDEX & refresh)** yang sudah terbukti efektif untuk kasus laporan & query berat.
@ -270,10 +259,190 @@ Cari:
--- ---
Kalau mau, saya bisa: Siap 👍
Berikut **template INDEX Materialized View PostgreSQL berbasis pola query**. Kamu tinggal **sesuaikan nama kolom & MV**.
* ⚙️ Buatkan **template index berdasarkan query kamu** ---
* 📊 Analisis `EXPLAIN ANALYZE` hasilmu
* ⏱️ Rekomendasi jadwal refresh (harian/jam)
Kirim saja **struktur MV + contoh query yang sering dipakai**. ## 🧠 Cara Pakai Template
1. Ambil **query paling sering dipakai**
2. Cocokkan dengan **pola di bawah**
3. Terapkan index sesuai template
---
## 1⃣ Query dengan `WHERE =` (Filter Exact)
```sql
SELECT *
FROM mv_laporan
WHERE tanggal = '2025-12-01'
AND cabang_id = 10;
```
### ✅ Index (Composite)
```sql
CREATE INDEX idx_mv_laporan_tanggal_cabang
ON mv_laporan (tanggal, cabang_id);
```
📌 **Urutan kolom penting!**
Kolom yang paling sering difilter → di depan.
---
## 2⃣ Query `WHERE` + `ORDER BY`
```sql
SELECT *
FROM mv_laporan
WHERE cabang_id = 10
ORDER BY tanggal DESC
LIMIT 20;
```
### ✅ Index
```sql
CREATE INDEX idx_mv_laporan_cabang_tanggal_desc
ON mv_laporan (cabang_id, tanggal DESC);
```
⚡ Menghindari sort mahal.
---
## 3⃣ Query Range (`BETWEEN`, `>=`, `<=`)
```sql
SELECT *
FROM mv_laporan
WHERE tanggal BETWEEN '2025-12-01' AND '2025-12-31';
```
### ✅ Index
```sql
CREATE INDEX idx_mv_laporan_tanggal
ON mv_laporan (tanggal);
```
---
## 4⃣ Query JOIN
```sql
SELECT m.*, c.nama
FROM mv_laporan m
JOIN cabang c ON c.id = m.cabang_id;
```
### ✅ Index
```sql
CREATE INDEX idx_mv_laporan_cabang_id
ON mv_laporan (cabang_id);
```
📌 Foreign key **WAJIB di-index**.
---
## 5⃣ Query Dashboard (Data Terbaru)
```sql
SELECT *
FROM mv_laporan
WHERE tanggal >= CURRENT_DATE - INTERVAL '7 days';
```
### ✅ Partial Index
```sql
CREATE INDEX idx_mv_laporan_7hari
ON mv_laporan (tanggal)
WHERE tanggal >= CURRENT_DATE - INTERVAL '7 days';
```
🚀 Sangat cepat untuk data “recent”.
---
## 6⃣ Index untuk `REFRESH CONCURRENTLY`
```sql
REFRESH MATERIALIZED VIEW CONCURRENTLY mv_laporan;
```
### ✅ Wajib UNIQUE index
```sql
CREATE UNIQUE INDEX ux_mv_laporan
ON mv_laporan (tanggal, cabang_id);
```
Tanpa ini → ❌ ERROR.
---
## 7⃣ Index Only Scan (Covering Index)
```sql
SELECT tanggal, total_penjualan
FROM mv_laporan
WHERE cabang_id = 10;
```
### ✅ Index
```sql
CREATE INDEX idx_mv_laporan_cover
ON mv_laporan (cabang_id)
INCLUDE (tanggal, total_penjualan);
```
⚡ Planner bisa **tanpa baca table**.
---
## 8⃣ Query Aggregasi Ulang (GROUP BY kecil)
```sql
SELECT cabang_id, SUM(total_penjualan)
FROM mv_laporan
GROUP BY cabang_id;
```
### ✅ Index
```sql
CREATE INDEX idx_mv_laporan_group
ON mv_laporan (cabang_id, total_penjualan);
```
---
## 🔥 Template Universal (Aman untuk 80% kasus)
```sql
CREATE UNIQUE INDEX ux_mv_laporan_pk
ON mv_laporan (tanggal, cabang_id);
CREATE INDEX idx_mv_laporan_filter
ON mv_laporan (cabang_id, tanggal DESC)
INCLUDE (total_penjualan);
```
---
## ✅ Setelah Buat Index
Jangan lupa:
```sql
ANALYZE mv_laporan;
```
---