Bergantung pada berapa banyak set data yang berbeda, satu opsi adalah mempartisi tabel per-dataset.
Ketika dataset diperbarui, BEGIN
transaksi baru, TRUNCATE
tabel, COPY
data baru ke dalamnya, dan COMMIT
. PostgreSQL memiliki pengoptimalan di mana COPY
ke dalam tabel yang telah TRUNCATE
d dalam transaksi yang sama melakukan jauh lebih sedikit I / O jika Anda menggunakan wal_level = minimal
(default).
Jika Anda tidak dapat mempartisi dan memotong (katakanlah, jika Anda berhadapan dengan puluhan atau ratusan ribu kumpulan data, di mana hanya akan ada terlalu banyak tabel) Anda akan ingin menghidupkan autovacuum agar berjalan sebanyak yang bisa dilakukan. , pastikan Anda memiliki indeks yang baik pada apa pun yang Anda hapus berdasarkan, dan bersiaplah untuk kinerja yang agak biasa.
Jika Anda tidak memerlukan keamanan kerusakan - Anda tidak keberatan meja Anda kosong setelah sistem crash - Anda juga dapat membuat tabel Anda sebagai UNLOGGED
, yang akan menghemat banyak biaya I / O.
Jika Anda tidak keberatan harus mengembalikan seluruh pengaturan dari cadangan setelah sistem crash, Anda dapat melangkah lebih jauh dan juga mengatur fsync=off
, yang pada dasarnya mengatakan kepada PostgreSQL "tidak peduli dengan keselamatan kecelakaan, saya memiliki cadangan yang baik dan saya tidak tidak peduli apakah data saya secara permanen dan benar - benar tidak dapat dipulihkan setelah crash, dan saya senang untuk kembali initdb
sebelum saya dapat menggunakan database saya lagi ".
Saya menulis lebih banyak tentang ini di utas serupa di Stack Overflow tentang mengoptimalkan PostgreSQL untuk pengujian cepat ; yang menyebutkan host OS tuning, memisahkan WAL ke disk yang berbeda jika Anda tidak menggunakan unlogged
tabel, penyesuaian checkpointer, dll.
Ada juga beberapa info dalam dokumen Pg untuk pemuatan data yang cepat dan pengaturan yang tidak tahan lama .