Saya baru-baru ini menambahkan kolom bit yang bisa NULL ke tabel yang memiliki hampir 500 juta baris. Tidak ada default pada kolom, namun semua sisipan menentukan nilai 0 atau 1, dan saya menjalankan rutin satu kali untuk menetapkan 0 atau 1 ke semua baris yang ada (memperbarui baris dalam batch kecil). Setiap baris sekarang harus memiliki 0 atau 1 di kolom itu.
Saya ingin membuat kolom bit non-nullable tetapi ketika saya mencoba melakukannya melalui ALTER TABLE t1 ALTER COLUMN c1 bit not null
, itu mulai berjalan selama 3 menit dan saya menghentikannya karena itu memblokir semua bacaan ke meja dan saya menduga itu akan memakan waktu lama untuk menyelesaikannya. . Mungkin saja tidak akan terlalu lama, tetapi saya tidak bisa mengambil risiko terlalu banyak tidak tersedianya. Kembalikan itu sendiri membutuhkan waktu 6 menit.
Apakah Anda memiliki saran tentang bagaimana saya dapat membuat kolom tidak dapat dibatalkan tanpa perlu waktu berjam-jam untuk menyelesaikannya? Selain itu, adakah cara untuk memperkirakan berapa lama ALTER TABLE ALTER COLUMN
pernyataan yang saya mulai dan kemudian batalkan akan selesai?
Saya menggunakan SQL Server 2017 Web Edition.
sumber
SELECT c1, count(*) FROM t1 GROUP BY c1
yang membutuhkan waktu sekitar 9 menit untuk berjalan.ALTER TABLE ALTER COLUMN
Pernyataan aktual setelah itu membutuhkan 25 menit untuk selesai. Lumayan.Jika Anda menggunakan Enterprise Edition (EE), strategi yang lebih baik mungkin adalah menambahkannya
NOT NULL
dengan default0
atau1
(mana yang paling umum).Ini adalah perubahan metadata-satunya dalam EE . Kemudian perbarui yang perlu dibalik. Ini berarti lebih sedikit pembaruan dan tidak perlu mengubah kolom nullability ketika selesai. - martin-smith
sumber
Coba salin data ke tabel baru, lalu ganti namanya. Anda harus mengurus semua kendala dan indeks. Itulah yang dilakukan perancang tabel SSMS saat Anda ingin menyusun ulang kolom (misalnya), tetapi Anda harus memeriksa skrip untuk melihat apakah ada sesuatu yang tidak beres.
Selama penyalinan, akses baca ke tabel sumber bukan masalah, tetapi jika ada penulisan, mereka mungkin diblokir atau tidak disalin, tergantung pada tingkat isolasi.
sumber