คำตอบของ @ ypercubeจัดการบางส่วนนี้เนื่องจากข้อมูลเมตามีการเปลี่ยนแปลงเท่านั้น
การเพิ่มข้อ จำกัด ด้วยNOCHECK
วิธีที่ไม่จำเป็นต้องอ่านแถวเพื่อยืนยันและถ้าคุณเริ่มจากตำแหน่งที่คอลัมน์ไม่มีNULL
ค่า (และถ้าคุณรู้ว่าไม่มีใครจะถูกเพิ่มระหว่างการตรวจสอบและเพิ่มข้อ จำกัด ) เนื่องจากข้อ จำกัด จะป้องกันNULL
ค่าที่ถูกสร้างขึ้นจากอนาคตINSERT
หรือUPDATE
การดำเนินการสิ่งนี้จะได้ผล
อย่างไรก็ตามการเพิ่มข้อ จำกัด ยังคงมีผลกระทบต่อการทำธุรกรรมพร้อมกัน ALTER TABLE
จะต้องได้รับSch-M
ล็อคแรก ในขณะที่มันกำลังรอให้ทั้งหมดนี้เข้าถึงตารางอื่น ๆ จะถูกปิดกั้นตามที่อธิบายไว้ที่นี่
เมื่อSch-M
ล็อคได้รับการดำเนินการควรจะค่อนข้างเร็วอย่างไรก็ตาม
ปัญหาอย่างหนึ่งของเรื่องนี้ก็คือแม้ว่าคุณจะรู้ว่าคอลัมน์ในความเป็นจริงไม่มีNULL
ข้อ จำกัด แต่ก็ไม่ได้รับความเชื่อถือจากตัวปรับแต่งข้อความค้นหาซึ่งหมายความว่าแผนสามารถย่อยได้ดีที่สุด
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)
เปรียบเทียบสิ่งนี้กับสิ่งที่ง่ายกว่า
ALTER TABLE T ALTER COLUMN X INT NOT NULL
SELECT *
FROM T
WHERE X NOT IN (SELECT X FROM T)
ปัญหาที่เป็นไปได้อย่างหนึ่งที่คุณอาจประสบกับการแก้ไขนิยามคอลัมน์ด้วยวิธีนี้คือไม่เพียง แต่ต้องอ่านแถวทั้งหมดเพื่อตรวจสอบว่าตรงตามเงื่อนไข แต่ยังสามารถจบลงด้วยการอัปเดตที่บันทึกไว้ในแถวจริง
WITH CHECK
วิธีที่บ้านครึ่งหนึ่งที่เป็นไปได้อาจจะมีการเพิ่มข้อ จำกัด การตรวจสอบ สิ่งนี้จะช้ากว่าWITH NOCHECK
ที่ต้องอ่านทุกแถว แต่จะอนุญาตให้เครื่องมือเพิ่มประสิทธิภาพคิวรีให้แผนที่ง่ายขึ้นในแบบสอบถามด้านบนและควรหลีกเลี่ยงปัญหาการอัพเดตที่บันทึกไว้ที่เป็นไปได้