@ ypercube menjawab bahwa sebagian ini dikelola hanya sebagai metadata yang berubah.
Menambahkan kendala dengan NOCHECKberarti bahwa tidak ada baris yang perlu dibaca untuk memverifikasinya, dan jika Anda mulai dari posisi di mana kolom tidak mengandung NULLnilai (dan jika Anda tahu tidak akan ditambahkan antara memeriksa dan menambahkan kendala), karena kendala mencegah NULLnilai yang dibuat dari masa depan INSERTatau UPDATEoperasi, ini akan berhasil.
Menambahkan kendala masih dapat berdampak pada transaksi bersamaan. Yang ALTER TABLEperlu mendapatkan Sch-Mkunci terlebih dahulu. Sementara menunggu, semua akses tabel lainnya akan diblokir seperti dijelaskan di sini .
Namun begitu Sch-Mkunci diperoleh, operasi harus cukup cepat.
Satu masalah dengan ini adalah bahwa bahkan jika Anda tahu kolom sebenarnya tidak memiliki NULLkendala tidak dipercaya oleh pengoptimal permintaan yang berarti bahwa rencana dapat menjadi kurang optimal.
CREATE TABLE T (X INT NULL)
INSERT INTO T
SELECT ROW_NUMBER() OVER (ORDER BY @@SPID)
FROM master..spt_values
ALTER TABLE T WITH NOCHECK
ADD CONSTRAINT X_NOT_NULL
CHECK (X IS NOT NULL) ;
SELECT *
FROM T
WHERE X NOT IN (SELECT X FROM T)

Bandingkan ini dengan yang lebih sederhana
ALTER TABLE T ALTER COLUMN X INT NOT NULL
SELECT *
FROM T
WHERE X NOT IN (SELECT X FROM T)

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 daripada WITH NOCHECKkarena 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.