Perintah ANALYZE pada PostgreSQL digunakan untuk mengumpulkan statistik mengenai isi tabel di dalam database, yang kemudian disimpan dalam katalog sistem pg_statistic. Query optimizer PostgreSQL menggunakan data statistik ini untuk menentukan jalur eksekusi (query plan) yang paling efisien dalam mengambil data. Tanpa statistik yang akurat, perencana kueri dapat membuat keputusan yang salah, seperti memilih pemindaian sekuensial (sequential scan) alih-alih pemindaian indeks (index scan), yang mengakibatkan performa kueri menjadi lambat.
Secara mendasar, ANALYZE memeriksa baris dalam tabel, menghitung distribusi nilai untuk kolom tertentu, dan menyimpan hasilnya untuk digunakan oleh query planner. Perintah ini sangat krusial dijalankan setelah ada perubahan data dalam jumlah besar, seperti setelah operasi INSERT, UPDATE, atau DELETE masif.
Sintaks Dasar Perintah ANALYZE
Sintaks untuk menjalankan perintah ini sangat fleksibel, mulai dari menganalisis seluruh database, satu tabel spesifik, hingga kolom tertentu saja. Berikut adalah bentuk umum sintaksnya:
-- Menganalisis seluruh database
ANALYZE;
-- Menganalisis satu tabel tertentu
ANALYZE nama_tabel;
-- Menganalisis tabel tertentu dengan opsi verbose
ANALYZE VERBOSE nama_tabel;
-- Menganalisis kolom spesifik pada sebuah tabel
ANALYZE nama_tabel (nama_kolom1, nama_kolom2);
Tabel Referensi Opsi dan Parameter ANALYZE
Dalam penggunaannya, perintah ANALYZE dapat dikombinasikan dengan beberapa parameter untuk melihat proses secara detail atau mengatur tingkat penguncian tabel. Berikut adalah rincian parameter yang tersedia:
| Parameter / Opsi | Fungsi Utama | Dampak pada Sistem |
|---|---|---|
VERBOSE |
Menampilkan laporan kemajuan secara detail di layar saat proses analisis berjalan. | Aman, memberikan informasi statistik tabel yang sedang diproses. |
ANALYZE (standalone) |
Memperbarui statistik tanpa mengubah struktur data tabel. | Membutuhkan kunci akses baca (AccessShareLock), tidak memblokir operasi tulis (INSERT/UPDATE). |
VACUUM ANALYZE |
Membersihkan ruang kosong (dead tuples) sekaligus memperbarui statistik tabel. | Memerlukan sumber daya I/O disk yang lebih tinggi, sangat disarankan untuk pemeliharaan rutin. |
Langkah Teknis Penerapan di PostgreSQL
Untuk menerapkan perintah ini dalam lingkungan produksi, ikuti langkah-langkah penanganan performa berikut:
- Identifikasi Tabel Lambat: Gunakan perintah
EXPLAIN ANALYZEpada kueri yang lambat untuk melihat apakah perencana kueri menggunakan estimasi jumlah baris (estimated rows) yang jauh berbeda dari jumlah baris aktual (actual rows). - Jalankan Analisis Manual: Jika perbedaan estimasi sangat tinggi, jalankan
ANALYZE nama_tabel;pada tabel terkait. - Pantau Proses: Gunakan opsi
VERBOSEjika ingin melihat durasi dan jumlah halaman disk yang dipindai.
Tips Troubleshooting dan Praktik Terbaik
Meskipun ANALYZE adalah operasi yang ringan, ada beberapa hal penting yang harus diperhatikan oleh Administrator Database (DBA):
- Autovacuum: PostgreSQL memiliki fitur
autovacuumyang secara otomatis menjalankanANALYZEketika terjadi perubahan data yang signifikan (berdasarkan parameterautovacuum_analyze_thresholddanautovacuum_analyze_scale_factor). Oleh karena itu, analisis manual jarang diperlukan kecuali setelah migrasi data besar-besaran. - Non-Blocking: Berbeda dengan
VACUUM FULL, perintahANALYZEtidak mengunci tabel secara eksklusif. Aplikasi tetap bisa melakukan pembacaan dan penulisan (SELECT,INSERT,UPDATE,DELETE) saat analisis sedang berjalan. - Pengaturan Statistik (Statistics Target): Anda dapat mengatur tingkat keakuratan statistik untuk kolom tertentu menggunakan perintah
ALTER TABLE nama_tabel ALTER COLUMN nama_kolom SET STATISTICS nilai;(rentang nilai 1 hingga 10000) sebelum menjalankanANALYZE.