जब आप NULL को कॉलम नहीं बदलते हैं, तो SQL सर्वर को हर एक पृष्ठ को स्पर्श करना होता है , भले ही NULL मान न हों। आपके भरण कारक के आधार पर यह वास्तव में बहुत सारे पृष्ठ विभाजन को जन्म दे सकता है। प्रत्येक पृष्ठ, जो निश्चित रूप से छुआ गया है, को लॉग इन करना होगा, और मुझे विभाजन के कारण संदेह है कि कई पृष्ठों के लिए दो परिवर्तन लॉग करने पड़ सकते हैं। चूँकि यह सब एक ही पास में किया जाता है, हालाँकि, लॉग को सभी परिवर्तनों के लिए ध्यान रखना पड़ता है, ताकि यदि आप रद्द करते हैं, तो यह जानता है कि वास्तव में क्या करना है।
एक उदाहरण। सरल तालिका:
DROP TABLE dbo.floob;
GO
CREATE TABLE dbo.floob
(
id INT IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED,
bar INT NULL
);
INSERT dbo.floob(bar) SELECT NULL UNION ALL SELECT 4 UNION ALL SELECT NULL;
ALTER TABLE dbo.floob ADD CONSTRAINT df DEFAULT(0) FOR bar
अब, पृष्ठ विवरण देखें। पहले हमें यह पता लगाना होगा कि हम किस पृष्ठ और DB_ID के साथ काम कर रहे हैं। मेरे मामले में मैंने एक डेटाबेस बनाया foo
, और DB_ID 5 हुआ।
DBCC TRACEON(3604, -1);
DBCC IND('foo', 'dbo.floob', 1);
SELECT DB_ID();
आउटपुट ने संकेत दिया कि मुझे पेज 159 ( DBCC IND
आउटपुट में एकमात्र पंक्ति PageType = 1
) में दिलचस्पी थी ।
अब, हम ओपी के परिदृश्य के माध्यम से कदम बढ़ाते हुए कुछ चुनिंदा पृष्ठ विवरण देखते हैं।
DBCC PAGE(5, 1, 159, 3);
UPDATE dbo.floob SET bar = 0 WHERE bar IS NULL;
DBCC PAGE(5, 1, 159, 3);
ALTER TABLE dbo.floob ALTER COLUMN bar INT NOT NULL;
DBCC PAGE(5, 1, 159, 3);
अब, मेरे पास इसके सभी उत्तर नहीं हैं, क्योंकि मैं एक गहन प्रशिक्षु नहीं हूं। लेकिन यह स्पष्ट है कि - जबकि अपडेट ऑपरेशन और नॉट नाल बाधा के अलावा दोनों पृष्ठ पर नहीं लिखते हैं - बाद वाला पूरी तरह से अलग तरीके से ऐसा करता है। यह वास्तव में रिकॉर्ड की संरचना को बदलने के लिए लगता है, न कि केवल बिट्स के साथ बेला के बजाय, एक अशक्त स्तंभ के लिए अशक्त स्तंभ को स्वैप करके। ऐसा क्यों करना है, मुझे यकीन नहीं है - भंडारण इंजन टीम के लिए एक अच्छा सवाल है , मुझे लगता है। मुझे विश्वास है कि SQL Server 2012 इन परिदृश्यों में से कुछ को बेहतर तरीके से संभालता है, FWIW - लेकिन मुझे अभी तक कोई भी विस्तृत परीक्षण नहीं करना है।
NOT NULL
। इसके अलावा में "एक ऑनलाइन ऑपरेशन के रूप में नहीं NULL कॉलम जोड़ना" को देखने के प्रलेखन ।