Karena Anda menggabungkan dua tabel besar dan tidak ada kondisi yang dapat memfilter baris, satu-satunya strategi penggabungan yang efisien adalah penggabungan hash, dan tidak ada indeks yang dapat membantu dengan itu.
Pertama akan ada pemindaian berurutan dari salah satu tabel, dari mana struktur hash dibangun, kemudian akan ada pemindaian berurutan di atas tabel lainnya, dan hash akan diperiksa untuk setiap baris yang ditemukan. Bagaimana indeks bisa membantu dengan itu?
Anda dapat mengharapkan operasi seperti itu memakan waktu lama, tetapi ada beberapa cara untuk mempercepat operasi:
-
Hapus semua indeks dan batasan pada
tx_input1
sebelum kamu memulai. Permintaan Anda adalah salah satu contoh di mana indeks tidak membantu sama sekali, tetapi sebenarnya menyakitkan kinerja, karena indeks harus diperbarui bersama dengan tabel. Buat ulang indeks dan batasan setelah Anda selesai denganUPDATE
. Bergantung pada jumlah indeks di tabel, Anda dapat mengharapkan peningkatan kinerja yang layak hingga besar. -
Tingkatkan
work_mem
parameter untuk operasi yang satu ini denganSET
perintah setinggi mungkin. Semakin banyak memori yang dapat digunakan oleh operasi hash, semakin cepat. Dengan tabel sebesar itu, Anda mungkin masih memiliki file sementara, tetapi Anda masih dapat mengharapkan peningkatan kinerja yang layak. -
Tingkatkan
checkpoint_segments
(ataumax_wal_size
dari versi 9.6 aktif) ke nilai tinggi sehingga ada lebih sedikit pos pemeriksaan selamaUPDATE
operasi. -
Pastikan statistik tabel pada kedua tabel akurat, sehingga PostgreSQL dapat memberikan perkiraan yang baik untuk jumlah hash bucket yang akan dibuat.
Setelah UPDATE
, jika itu memengaruhi sejumlah besar baris, Anda dapat mempertimbangkan untuk menjalankan VACUUM (FULL)
pada tx_input1
untuk menyingkirkan tabel yang dihasilkan mengasapi. Ini akan mengunci meja untuk waktu yang lebih lama, jadi lakukan selama masa pemeliharaan. Ini akan mengurangi ukuran tabel dan akibatnya mempercepat pemindaian berurutan.