Saya punya dua tabel database. Satu berisi ratusan juta catatan. Mari kita panggil yang itu history
. Yang lain dihitung setiap hari dan saya ingin menyalin semua catatannya menjadi history
satu.
Apa yang saya lakukan adalah menjalankan:
INSERT INTO history SELECT * FROM daily
Dan itu melakukan trik untuk sementara waktu, tetapi mulai menjadi lebih lambat dan lebih lambat karena jumlah catatan terus bertambah. Sekarang saya memiliki sekitar 2 juta catatan yang perlu disalin dari daily
ke history
dalam operasi tunggal dan butuh waktu terlalu lama untuk diselesaikan.
Apakah ada cara lain yang lebih efisien untuk menyalin data dari satu tabel ke tabel lainnya?
sumber
Buang tabel dalam format csv
gunakan perintah COPY yang jauh lebih efisien untuk sejumlah besar data.
Periksa postgres docs di http://www.postgresql.org/docs/current/static/sql-copy.html untuk info lebih lanjut
sumber
history
tabel, dan kami menambahkan 3 juta baris lagi.Masalahnya dengan indeks. The
history
meja memiliki 160M diindeks baris. Dengan menjalankan salah satuCOPY FROM
atauINSERT INTO .. SELECT
butuh banyak waktu untuk tidak memasukkan baris, tetapi untuk memperbarui indeks. Ketika saya menonaktifkan indeks, itu mengimpor baris 3M dalam 10 detik. Sekarang saya perlu menemukan cara yang lebih cepat untuk mengindeks ulang tabel besar.sumber
Anda dapat menggunakan alat psql , saya mungkin efisien, sebagai berikut,
Anda juga dapat menulis skrip shell.
sumber
Ini tentu saja bukan jawaban yang tepat untuk pertanyaan Anda, tetapi jika Anda tidak perlu mengakses
history
tabel, Anda juga bisa menghasilkan SQL dump:Maka orang dapat menggunakan alat seperti
git
untuk menghitung perbedaan dan menyimpan ini secara efisien.Ini berguna karena sebagian besar dalam database, tidak akan berubah setiap hari. Alih-alih menyimpan seluruh salinan untuk setiap hari, orang dapat menyimpan perbedaan antara dua hari.
Anda dapat menggunakan
crontab
pekerjaan sedemikian rupa sehingga dump diproses setiap hari.sumber