PostgreSQL Partition By Range: Panduan Sintaks & Contoh

Pengertian PostgreSQL Partition By Range

PostgreSQL Partition By Range adalah metode partisi tabel di mana data dibagi ke dalam beberapa tabel fisik terpisah (partisi) berdasarkan rentang nilai (range) dari kolom tertentu atau ekspresi, tanpa mengubah cara aplikasi berinteraksi dengan tabel utama (tabel induk). Metode ini sangat efektif untuk data berbasis waktu (seperti log, transaksi harian, atau pencatatan sensor) karena kueri yang menyaring data berdasarkan rentang tanggal dapat melewati partisi yang tidak relevan (proses yang disebut partition pruning).

Dalam arsitektur basis data skala besar, partisi rentang mengurangi ukuran indeks per tabel fisik, mempercepat operasi pembersihan data lama (seperti DROP TABLE pada partisi usang alih-alih menjalankan DELETE massal), dan menjaga kinerja I/O tetap optimal.

Sintaks Dasar Pembuatan Partition Table

Untuk membuat tabel berpartisipasi dalam skema range partitioning, tabel induk harus didefinisikan menggunakan klausa PARTITION BY RANGE (nama_kolom). Berikut adalah contoh implementasi pada tabel log aktivitas.

-- 1. Buat Tabel Induk (Parent Table)
CREATE TABLE audit_logs (
    log_id BIGSERIAL,
    log_time TIMESTAMP NOT NULL,
    message TEXT,
    severity INT
) PARTITION BY RANGE (log_time);

-- 2. Buat Tabel Partisi (Child Tables)
CREATE TABLE audit_logs_y2025m01 PARTITION OF audit_logs
    FOR VALUES FROM ('2025-01-01 00:00:00') TO ('2025-02-01 00:00:00');

CREATE TABLE audit_logs_y2025m02 PARTITION OF audit_logs
    FOR VALUES FROM ('2025-02-01 00:00:00') TO ('2025-03-01 00:00:00');

Matriks Karakteristik Partition By Range

Komponen Deskripsi Teknis Catatan Implementasi
Kolom Partisi Dapat berupa satu kolom atau ekspresi (misal: tipe DATE, TIMESTAMP, INTEGER, atau NUMERIC). Kolom partisi wajib menjadi bagian dari Primary Key atau Unique Index pada tabel induk jika didefinisikan.
Batas Nilai Menggunakan batas FROM (inclusice) TO (exclusive). Nilai awal masuk ke dalam partisi, sedangkan nilai akhir tidak masuk ke partisi tersebut (masuk ke partisi berikutnya).
Default Partition Dapat menampung baris data yang tidak masuk ke rentang partisi manapun (tersedia mulai PostgreSQL 11+). Gunakan CREATE TABLE ... PARTITION OF ... DEFAULT; untuk menangkap data di luar rentang terdefinisi.

Pengelolaan dan Pemeliharaan Partisi

Operasi rutin pada tabel berpartisi membutuhkan pendekatan khusus agar tidak mengunci tabel utama terlalu lama. Salah satu keunggulan terbesar partisi rentang adalah kemampuan menghapus data historis secara instan.

-- Menghapus data lama dengan cepat tanpa perintah DELETE yang membebani WAL
DROP TABLE audit_logs_y2025m01;

 Menambahkan partisi baru untuk bulan berikutnya
CREATE TABLE audit_logs_y2025m03 PARTITION OF audit_logs
    FOR VALUES FROM ('2025-03-01 00:00:00') TO ('2025-04-01 00:00:00');

Tips Troubleshooting Lapangan

  • Gagal Insert (No Partition Found): Jika Anda mencoba memasukkan baris data yang nilainya tidak mencakup rentang partisi mana pun (dan belum membuat partisi DEFAULT), PostgreSQL akan mengembalikan error no partition of relation found for row. Pastikan otomatisasi pembuatan partisi (misalnya menggunakan fungsi pg_partman atau cron job) berjalan sebelum periode waktu berganti.
  • Partition Pruning Tidak Aktif: Pastikan parameter konfigurasi enable_partitionwise_aggregate dan enable_partitionwise_join diaktifkan di tingkat sesi atau postgresql.conf jika Anda sering melakukan agregasi data lintas partisi yang besar.