Như @Souplex đã ám chỉ trong các bình luận, một lời giải thích có thể có thể là nếu cột này là cột có thể đầu tiên NULL
trong chỉ mục không được nhóm mà nó tham gia.
Đối với các thiết lập sau
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 hiển thị chỉ mục không được nhóm ix
có 248 trang lá và một trang gốc.
Một hàng điển hình trong trang lá chỉ mục trông giống như
Và trong trang gốc
Rồi chạy ...
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
Trả lại
+-----------------+--------------------+-------------+----------------+
| 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 |
+-----------------+--------------------+-------------+----------------+
Kiểm tra lá chỉ mục một lần nữa các hàng bây giờ trông giống như
và các hàng trong các trang cấp trên như bên dưới.
Mỗi hàng đã được cập nhật và hiện chứa hai byte cho số cột cùng với một byte khác cho NULL_BITMAP.
Do chiều rộng hàng thêm, chỉ mục không phân cụm hiện có 285 trang lá và hiện có hai trang cấp trung gian cùng với trang gốc.
Kế hoạch thực hiện cho
ALTER TABLE Foo ALTER COLUMN B CHAR(1) NULL;
trông như sau
Điều này tạo ra một bản sao hoàn toàn mới của chỉ mục thay vì cập nhật bản hiện có và cần chia trang.