Saya tidak punya jawaban "terbaik", tetapi saya punya jawaban "paling tidak buruk" yang mungkin membuat Anda menyelesaikan sesuatu dengan cukup cepat.
Tabel saya memiliki baris 2MM dan kinerja pembaruan menanjak ketika saya mencoba menambahkan kolom cap waktu sekunder yang default ke yang pertama.
ALTER TABLE mytable ADD new_timestamp TIMESTAMP ;
UPDATE mytable SET new_timestamp = old_timestamp ;
ALTER TABLE mytable ALTER new_timestamp SET NOT NULL ;
Setelah menggantung selama 40 menit, saya mencoba ini dalam jumlah kecil untuk mendapatkan gambaran berapa lama ini - perkiraannya sekitar 8 jam.
Jawaban yang diterima jelas lebih baik - tetapi tabel ini banyak digunakan dalam database saya. Ada beberapa lusin tabel yang FKEY ke atasnya; Saya ingin menghindari beralih KUNCI ASING pada banyak tabel. Dan kemudian ada pandangan.
Sedikit mencari dokumen, studi kasus dan StackOverflow, dan aku punya "A-Ha!" saat. Saluran tidak pada UPDATE inti, tetapi pada semua operasi INDEX. Tabel saya memiliki 12 indeks di atasnya - beberapa untuk kendala unik, beberapa untuk mempercepat perencana kueri, dan beberapa untuk pencarian teks lengkap.
Setiap baris yang DIPERBARUI tidak hanya bekerja pada DELETE / INSERT, tetapi juga overhead untuk mengubah setiap indeks dan memeriksa kendala.
Solusi saya adalah dengan menghapus setiap indeks dan kendala, memperbarui tabel, lalu menambahkan semua indeks / kendala kembali.
Butuh sekitar 3 menit untuk menulis transaksi SQL yang melakukan hal berikut:
- MULAI;
- menjatuhkan indeks / kendala
- perbarui tabel
- tambahkan kembali indeks / batasan
- MELAKUKAN;
Skrip membutuhkan waktu 7 menit untuk dijalankan.
Jawaban yang diterima jelas lebih baik dan lebih tepat ... dan secara virtual menghilangkan kebutuhan akan waktu henti. Namun, dalam kasus saya, akan diperlukan lebih banyak pekerjaan "Pengembang" untuk menggunakan solusi itu dan kami memiliki jendela 30 menit dari waktu henti yang dijadwalkan yang dapat diselesaikan. Solusi kami mengatasinya dalam 10.
ALTER TABLE .. ADD COLUMN ...
atau bagian itu yang harus dijawab juga?