@ 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
सभी पंक्तियों को पढ़ने की आवश्यकता की तुलना में धीमा होगा, लेकिन यह क्वेरी ऑप्टिमाइज़र को ऊपर की क्वेरी में सरल योजना देने की अनुमति देता है और इसे संभव लॉग इन अद्यतन समस्या से बचना चाहिए।