@ 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 mengandung NULL
nilai (dan jika Anda tahu tidak akan ditambahkan antara memeriksa dan menambahkan kendala), karena kendala mencegah NULL
nilai yang dibuat dari masa depan INSERT
atau UPDATE
operasi, ini akan berhasil.
Menambahkan kendala masih dapat berdampak pada transaksi bersamaan. Yang ALTER TABLE
perlu mendapatkan Sch-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.
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 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.