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 .
SIGKILL
edit, dll)UNLOGGED
tabel apa saja mungkinTRUNCATE
d, sehingga kosong pada saat start-up. Mereka tidak terpotong setelah shutdown dan restart bersih, tetapi Anda tidak harus bergantung pada mereka yang tahan lama.UNLOGGED
opsi per tabel hanya hebat.TRUNCATE
atauDROP/CREATE TABLE
berurutan?TRUNCATE
secara pribadi. Churn DDL memiliki biaya sendiri. Karena Anda membuat perubahan dengan frekuensi tinggi, akan sangat penting untuk memastikan bahwa Anda mengaktifkan agresivitas autovacuumpg_catalog.pg_class
dan tabel sistem lainnya yang mungkin menggembung di bawah beban kerja itu.