Saya memiliki tabel dengan jutaan baris dan kolom yang memungkinkan nilai NULL. Namun saat ini tidak ada baris yang memiliki nilai NULL untuk kolom itu (saya bisa memverifikasi ini dengan cukup cepat dengan kueri). Namun ketika saya menjalankan perintah
ALTER TABLE MyTable ALTER COLUMN MyColumn BIGINT NOT NULL;
pertanyaannya relatif selamanya . Ini sebenarnya membutuhkan waktu antara 10 dan 20 menit, lebih dari dua kali lebih lama dari menambahkan batasan pemeriksaan. Apakah ada cara untuk langsung memperbarui metadata tabel untuk kolom itu, terutama karena saya tahu bahwa tidak ada baris yang memiliki nilai NULL untuk kolom itu?
sql-server-2008
null
alter-table
Joseph Daigle
sumber
sumber
Sch-M
kunci ketika dibutuhkan "selamanya". Apakah Anda melihat apakah sedang menunggu atau sibuk?Jawaban:
@ ypercube menjawab bahwa sebagian ini dikelola hanya sebagai metadata yang berubah.
Menambahkan kendala dengan
NOCHECK
berarti bahwa tidak ada baris yang perlu dibaca untuk memverifikasinya, dan jika Anda mulai dari posisi di mana kolom tidak mengandungNULL
nilai (dan jika Anda tahu tidak akan ditambahkan antara memeriksa dan menambahkan kendala), karena kendala mencegahNULL
nilai yang dibuat dari masa depanINSERT
atauUPDATE
operasi, ini akan berhasil.Menambahkan kendala masih dapat berdampak pada transaksi bersamaan. Yang
ALTER TABLE
perlu mendapatkanSch-M
kunci terlebih dahulu. Sementara menunggu, semua akses tabel lainnya akan diblokir seperti dijelaskan di sini .Namun begitu
Sch-M
kunci diperoleh, operasi harus cukup cepat.Satu masalah dengan ini adalah bahwa bahkan jika Anda tahu kolom sebenarnya tidak memiliki
NULL
kendala tidak dipercaya oleh pengoptimal permintaan yang berarti bahwa rencana dapat menjadi kurang optimal.Bandingkan ini dengan yang lebih sederhana
Salah satu masalah yang mungkin Anda temui dengan mengubah definisi kolom dengan cara ini adalah bahwa itu tidak hanya perlu membaca semua baris untuk memverifikasi bahwa mereka memenuhi persyaratan tetapi juga dapat benar-benar melakukan pembaruan log masuk ke baris .
Rumah setengah jalan yang mungkin adalah menambahkan kendala pemeriksaan
WITH CHECK
. Ini akan lebih lambat daripadaWITH NOCHECK
karena harus membaca semua baris tetapi memungkinkan pengoptimal kueri untuk memberikan rencana yang lebih sederhana dalam kueri di atas dan harus menghindari kemungkinan pembaruan yang dicatat.sumber
Anda bisa, alih-alih mengubah kolom, menambahkan
CHECK
batasan tabel denganNOCHECK
opsi:sumber
NULL
tetapi tidak akan dapat digunakan oleh pengoptimal kueri.ALTER COLUMN
setelahSch-M
kunci diperoleh, ini tidak perlu memindai baris sama sekali). Hanya menunjukkan bahwa itu tidak persis sama (misalnya jika digunakan dalamNOT IN
kueri rencananya akan lebih kompleks)