Membaca EXPLAIN ANALYZE PostgreSQL untuk optimasi query
Pahami perbedaan estimasi dan eksekusi nyata saat mendiagnosis query yang lambat.
EXPLAIN vs EXPLAIN ANALYZE
EXPLAIN menampilkan rencana eksekusi berdasarkan estimasi dari statistik tabel, tanpa benar-benar menjalankan query. EXPLAIN ANALYZE benar-benar menjalankan query dan menampilkan waktu eksekusi nyata beserta jumlah baris aktual.
EXPLAIN ANALYZE
SELECT * FROM pesanan
WHERE pelanggan_id = 105
ORDER BY dibuat_pada DESC
LIMIT 20;
Membaca hasilnya
Contoh potongan hasil:
Limit (cost=0.42..8.60 rows=20 width=64) (actual time=0.05..0.09 rows=20 loops=1)
-> Index Scan Backward using idx_pesanan_pelanggan_tanggal on pesanan
(cost=0.42..120.30 rows=294 width=64) (actual time=0.05..0.08 rows=20 loops=1)
Index Cond: (pelanggan_id = 105)
Nilai cost adalah estimasi, sedangkan actual time adalah waktu nyata dalam milidetik. Jika rows estimasi jauh berbeda dari actual rows, statistik tabel mungkin sudah usang.
Sequential scan bukan selalu buruk
Untuk tabel kecil atau saat query mengambil sebagian besar baris, Seq Scan bisa lebih cepat daripada memakai indeks karena menghindari lompatan baca acak ke halaman data.
Memperbarui statistik
ANALYZE pesanan;
Statistik yang usang membuat perencana query memilih rencana yang kurang optimal. Jalankan ANALYZE setelah perubahan data dalam jumlah besar.
Latihan
Jalankan EXPLAIN ANALYZE pada query yang sering dipakai di aplikasi Anda, lalu identifikasi apakah ada Seq Scan pada tabel besar yang bisa dibantu dengan indeks baru.
