Apa cara terbaik untuk menambahkan kolom ke tabel produksi besar di SQL Server 2008 R2? Menurut buku-buku Microsoft online:
Perubahan yang ditentukan dalam ALTER TABLE diimplementasikan segera. Jika perubahan memerlukan modifikasi pada baris dalam tabel, ALTER TABLE memperbarui baris. ALTER TABLE mendapatkan kunci skema modifikasi di atas meja untuk memastikan bahwa tidak ada koneksi lain referensi bahkan metadata untuk tabel selama perubahan, kecuali operasi indeks online yang membutuhkan kunci SCH-M sangat pendek di akhir.
(http://msdn.microsoft.com/en-us/library/ms190273.aspx)
Di atas meja besar dengan jutaan baris, ini bisa memakan waktu cukup lama. Apakah mengambil pemadaman satu-satunya pilihan? Apa cara terbaik untuk menangani situasi seperti ini?
Jawaban:
"Tergantung"
Jika Anda menambahkan kolom yang tidak perlu menambahkan data ke baris, maka itu bisa sangat cepat.
Misalnya, menambahkan int atau char membutuhkan gerakan baris fisik. Menambahkan nullable varchar tanpa default seharusnya tidak (kecuali bitmap NULL perlu diperluas)
Anda perlu mencobanya pada salinan produksi yang dipulihkan untuk mendapatkan perkiraan
Membuat tabel baru, menyalin, mengganti nama mungkin membutuhkan waktu lebih lama jika Anda harus menambahkan kembali indeks dan kunci pada satu miliar tabel baris.
Saya telah mengubah miliar tabel baris yang membutuhkan waktu beberapa detik untuk menambahkan kolom yang dapat dibatalkan.
Apakah saya mengatakan untuk mengambil cadangan terlebih dahulu?
sumber
Jika kolom NULLable, dampaknya harus diabaikan. Jika kolom tidak bisa NULL dan nilainya harus ditetapkan, maka itu bisa sangat berbeda. Apa yang akan saya lakukan dalam kasus ini adalah, alih-alih menambahkan batasan tidak nol dan standar dalam satu kesempatan, secara efektif menambahkan data ke setiap baris:
Setuju dengan @gbn bahwa Anda dapat menguji ini dengan mengembalikan salinan produksi dan mencobanya di sana ... Anda akan mendapatkan ide yang bagus tentang waktu (dengan asumsi perangkat keras agak mirip) dan Anda juga dapat melihat dampaknya pada log transaksi.
sumber
•add the not null/default constraints
Saya tidak yakin tidak ada masalah potensial dengan ini ... Ketika MSSQL (bahkan 2008R2) mengubah kolom bukan nol menjadi nol, jika Anda melacak, Anda dapat melihatnya benar-benar di bawah selimut melakukan pembaruan penuh dari setiap baris tabel, yaituupdate table1 set column1 = column1
saya menganggap itu melakukan verifikasi tidak-nol dengan cara yang benar-benar bodoh. Transaksi ini dua kali ukuran tabel (sebelum dan sesudah halaman) sehingga untuk tabel DW bisa sangat besar. Sebelumnya kami harus mengeluarkan data bcp, memotong, melakukan perubahan null ke non-null, lalu bcp masukSudahkah Anda mempertimbangkan:
Kerugiannya di sini adalah Anda harus memiliki ruang yang cukup dalam database untuk melakukan perubahan ini. Anda mungkin masih memerlukan kunci baca di atas meja untuk mencegah pembacaan yang kotor.
Namun, Anda meminimalkan dampaknya kepada pengguna akhir jika ada kesempatan atau kebutuhan untuk tabel asli untuk diakses secara bersamaan. Ini juga harus meminimalkan durasi kunci.
sumber