@ câu trả lời của ypercube không quản lý phần này vì siêu dữ liệu chỉ thay đổi.
Thêm ràng buộc với NOCHECK
nghĩa là sẽ không cần đọc hàng để xác minh nó và nếu bạn đang bắt đầu từ vị trí mà cột không chứa NULL
giá trị (và nếu bạn biết sẽ không có hàng nào được thêm vào giữa việc kiểm tra và thêm ràng buộc), thì, vì các ràng buộc ngăn chặn NULL
các giá trị được tạo ra từ tương laiINSERT
hoặc các UPDATE
hoạt động, điều này sẽ hoạt động.
Tuy nhiên, việc thêm các ràng buộc vẫn có thể có tác động đến các giao dịch đồng thời. Các ALTER TABLE
sẽ cần phải có được một Sch-M
khóa đầu tiên. Trong khi chờ đợi, tất cả các truy cập bảng khác sẽ bị chặn như được mô tả ở đây .
Một khi Sch-M
khóa được lấy, thao tác sẽ khá nhanh.
Một vấn đề với điều này là ngay cả khi bạn biết cột trong thực tế không có NULL
ràng buộc nào không được tin cậy bởi trình tối ưu hóa truy vấn, điều đó có nghĩa là các kế hoạch có thể là tối ưu phụ.
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)
So sánh điều này với đơn giản hơn
ALTER TABLE T ALTER COLUMN X INT NOT NULL
SELECT *
FROM T
WHERE X NOT IN (SELECT X FROM T)
Một vấn đề có thể bạn có thể gặp phải khi thay đổi định nghĩa cột theo cách này là nó không chỉ cần đọc tất cả các hàng để xác minh rằng chúng đáp ứng điều kiện mà còn có thể thực sự thực hiện cập nhật nhật ký cho các hàng .
Một ngôi nhà nửa đường có thể là để thêm các ràng buộc kiểm tra WITH CHECK
. Điều này sẽ chậm hơn WITH NOCHECK
vì nó cần đọc tất cả các hàng nhưng nó cho phép trình tối ưu hóa truy vấn đưa ra kế hoạch đơn giản hơn trong truy vấn ở trên và nó sẽ tránh được sự cố cập nhật có thể xảy ra.