जैसा कि टिप्पणियों में @Souplex द्वारा किया गया था, एक संभावित स्पष्टीकरण यह हो सकता है कि यह कॉलम NULL
गैर-संकुलित सूचकांक में पहला- सक्षम स्तंभ है, जिसमें यह भाग लेता है।
निम्नलिखित सेटअप के लिए
CREATE TABLE Foo
(
A UNIQUEIDENTIFIER NOT NULL DEFAULT NEWSEQUENTIALID() PRIMARY KEY,
B CHAR(1) NOT NULL DEFAULT 'B'
)
CREATE NONCLUSTERED INDEX ix
ON Foo(B);
INSERT INTO Foo
(B)
SELECT TOP 100000 'B'
FROM master..spt_values v1,
master..spt_values v2
sysinos_db_index_physical_stats दर्शाता है कि गैर-संकुल सूचकांक ix
में 248 पत्ती पृष्ठ और एक एकल रूट पृष्ठ है।
एक इंडेक्स लीफ पेज में एक विशिष्ट पंक्ति दिखती है
और रूट पेज में
फिर चल रहा है ...
CHECKPOINT;
GO
ALTER TABLE Foo ALTER COLUMN B CHAR(1) NULL;
SELECT Operation,
Context,
ROUND(SUM([Log Record Length]) / 1024.0,1) AS [Log KB],
COUNT(*) as [OperationCount]
FROM sys.fn_dblog(NULL,NULL)
WHERE AllocUnitName = 'dbo.Foo.ix'
GROUP BY Operation, Context
लौटा हुआ
+-----------------+--------------------+-------------+----------------+
| Operation | Context | Log KB | OperationCount |
+-----------------+--------------------+-------------+----------------+
| LOP_SET_BITS | LCX_GAM | 4.200000 | 69 |
| LOP_FORMAT_PAGE | LCX_IAM | 0.100000 | 1 |
| LOP_SET_BITS | LCX_IAM | 4.200000 | 69 |
| LOP_FORMAT_PAGE | LCX_INDEX_INTERIOR | 8.700000 | 3 |
| LOP_FORMAT_PAGE | LCX_INDEX_LEAF | 2296.200000 | 285 |
| LOP_MODIFY_ROW | LCX_PFS | 16.300000 | 189 |
+-----------------+--------------------+-------------+----------------+
तर्जनी की जाँच फिर से पंक्तियों की तरह लग रही है
और नीचे के रूप में ऊपरी स्तर के पन्नों में पंक्तियाँ।
प्रत्येक पंक्ति को अपडेट कर दिया गया है और अब NULL_BITMAP के लिए एक अन्य बाइट के साथ कॉलम गणना के लिए दो बाइट्स हैं।
अतिरिक्त पंक्ति चौड़ाई के कारण नॉन क्लस्टर्ड इंडेक्स में अब 285 लीफ पेज और अब रूट पेज के साथ दो मध्यवर्ती स्तर के पेज हैं।
के लिए निष्पादन योजना
ALTER TABLE Foo ALTER COLUMN B CHAR(1) NULL;
इस प्रकार दिखता है
यह मौजूदा एक को अपडेट करने और पृष्ठों को विभाजित करने की आवश्यकता के बजाय सूचकांक की एक नई प्रतिलिपि बनाता है।