ASDEV logo

ASDEV

Asdev Solution Technology

AdvancedDatabase

Optimasi Query PostgreSQL: Strategi Indexing & Partitioning Skala Besar

Analisis EXPLAIN ANALYZE, implementasi B-Tree, GIN, Partial Index, serta partisi tabel dengan jutaan baris data.

Data & Infrastructure Lead20 menit baca21 Oktober 20262 views
#PostgreSQL#Database#Performance#Indexing#DevOps

Mengapa Query Menjadi Lambat?

Ketika volume tabel melampaui 1 juta baris, Sequential Scan (Full Table Scan) akan membebani memory dan I/O disk server secara drastis.

1. Diagnosa dengan EXPLAIN ANALYZE

Jalankan query dengan profiling eksekusi aktual:

sql
EXPLAIN (ANALYZE, BUFFERS)
SELECT * FROM transactions
WHERE status = 'PAID' AND created_at >= '2026-01-01';

Perhatikan metrik:

  • Cost: Perkiraan beban komputasi.
  • Actual Time: Waktu riil eksekusi milidetik.
  • Buffers (Shared Hit/Read): Akses RAM cache vs Disk I/O.

2. Implementasi Partial & Composite Index

Jika 90% transaksi berstatus 'COMPLETED', mengindeks seluruh tabel adalah pemborosan storage. Gunakan Partial Index:

sql
-- Hanya membuat index untuk status aktif yang sering difilter
CREATE INDEX idx_trans_pending_created 
ON transactions (created_at DESC) 
WHERE status = 'PENDING';

3. Table Partitioning Berdasarkan Waktu

Untuk tabel riwayat log atau transaksi finansial bertaraf multi-juta baris, partisi deklaratif PostgreSQL adalah solusi ideal:

sql
CREATE TABLE transaction_logs (
    id UUID NOT NULL,
    user_id UUID NOT NULL,
    amount NUMERIC(15, 2),
    created_at TIMESTAMP NOT NULL
) PARTITION BY RANGE (created_at);

-- Partisi per Kuartal
CREATE TABLE logs_2026_q1 PARTITION OF transaction_logs
    FOR VALUES FROM ('2026-01-01') TO ('2026-04-01');
text

Siap mendalami topik lainnya?

Koleksi tutorial arsitektur, clean code, dan DevOps kami diperbarui secara berkala.

Kembali ke Katalog Tutorial