ตามที่กล่าวถึงโดย @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
sys.dm_db_index_physical_stats แสดงดัชนีที่ไม่ทำคลัสเตอร์ix
มี 248 leaf leaf page และ root เพจเดียว
แถวทั่วไปในหน้าดัชนีของใบไม้ดูเหมือนว่า
และในหน้ารูท
จากนั้นวิ่ง ...
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 leaf leaf page และตอนนี้เพจระดับกลางสองเพจพร้อมกับรูทเพจ
แผนการดำเนินการสำหรับ
ALTER TABLE Foo ALTER COLUMN B CHAR(1) NULL;
มีลักษณะดังนี้
สิ่งนี้สร้างสำเนาใหม่ของดัชนีแทนที่จะอัปเดตดัชนีที่มีอยู่และต้องการแยกหน้า