Bagi siapa saja yang berakhir di sini mencari cara menghapus partisi tabel di PostgreSQL, inilah jawaban modernnya.
Solusinya adalah tidak menggunakan pernyataan DELETE karena itu akan menghapus data tanpa menghapus partisi tabel terkait yang menyimpan data. OP bertanya tentang mengelola tabel partisi, bukan menghapus catatan, jadi solusi apa pun yang menggunakan pernyataan DELETE menambahkan overhead database yang tidak perlu untuk menghapus catatan, membiarkan tabel partisi kosong di tempatnya, dan sepenuhnya mengabaikan salah satu manfaat utama menggunakan partisi; MENJAUHKAN tabel ketika tidak lagi berguna.
Dalam hal ini solusinya harus DROP tabel partisi yang tidak lagi diperlukan. Saya telah menulis solusi untuk mengatasi masalah ini di lingkungan produksi saya, jawabannya adalah di sini .
Untuk mengatasi masalah OP, fungsi yang saya tulis dapat digunakan dengan dua revisi kecil untuk mengubah fullTablename variabel dan format tanggal. Baris variabel fullTablename harus diubah dari
fullTablename := base_table_name || '_' || to_char(startTime, dateFormat);
ke format YYYY-MM-DD_log seperti ini
fullTablename := to_char(startTime, dateFormat) || '_' || base_table_name;
Maka format tanggal perlu sedikit diubah dari
WHEN partition_plan='day' THEN 'YYYYDDD'
ke konvensi penamaan tabel yang dinyatakan
WHEN partition_plan='day' THEN 'YYYY-MM-DD'
Kemudian kueri SQL yang memanggil fungsi untuk melakukan pembersihan dapat dipanggil dari skrip pemeliharaan harian seperti ini:
SELECT public.drop_partitions(current_date-180, 'public', 'log', 5, 'day');
Yang akan MENGHAPUS tabel YYYY-MM-DD_log yang 5 hari lebih tua dari 180 beberapa hari yang lalu. Untuk menjalankan awal untuk menghapus lusinan atau ratusan partisi tabel lama, 5 dapat diatur ke nilai yang jauh lebih tinggi untuk mencapai efek yang diinginkan.