Saya mencoba membuat PostgreSQL untuk secara otomatis mengosongkan database saya. Saat ini saya mengkonfigurasi vakum otomatis sebagai berikut:
- autovacuum_vacuum_cost_delay = 0 # Matikan vakum berbasis biaya
- autovacuum_vacuum_cost_limit = 10000 #Max value
- autovacuum_vacuum_threshold = 50 # Nilai kerusakan
- autovacuum_vacuum_scale_factor = 0.2 # Nilai kerusakan
Saya perhatikan bahwa vakum otomatis hanya menendang ketika basis data tidak di bawah beban, jadi saya masuk ke situasi di mana terdapat lebih banyak tupel mati daripada tupel hidup. Lihat screenshot yang terlampir sebagai contoh. Salah satu tabel memiliki 23 tupel hidup tetapi 16845 tupel mati menunggu ruang hampa. Itu gila!
Vakum otomatis dimulai ketika uji coba selesai dan server basis data idle, yang bukan itu yang saya inginkan karena saya ingin pengosongan otomatis dilakukan setiap kali jumlah tupel mati melebihi 20% tupel hidup + 50, karena basis data telah dikonfigurasi Vakum otomatis ketika server idle tidak berguna bagi saya, karena server produksi diharapkan mencapai pembaruan 1000 detik / detik untuk periode yang berkelanjutan, itulah sebabnya saya perlu vakum otomatis untuk menjalankan meskipun server sedang memuat.
Apakah ada sesuatu yang saya lewatkan? Bagaimana cara memaksa vakum otomatis untuk menjalankan saat server berada di bawah beban berat?
Memperbarui
Mungkinkah ini masalah penguncian? Tabel yang dimaksud adalah tabel ringkasan yang diisi melalui pemicu setelah insert. Tabel-tabel ini dikunci dalam mode SHARE ROW EXCLUSIVE untuk mencegah penulisan bersamaan ke baris yang sama.