মন্তব্যে @ সপলেক্সের দ্বারা ইঙ্গিত হিসাবে একটি সম্ভাব্য ব্যাখ্যা হতে পারে যদি এই কলামটি 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
sys.dm_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;
নিম্নলিখিত হিসাবে দেখায়
এটি বিদ্যমান সূচি আপডেট করার পরিবর্তে পৃষ্ঠাগুলি বিভক্ত করার পরিবর্তে সূচকের একদম নতুন অনুলিপি তৈরি করে।