주석에서 @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 개의 리프 페이지와 단일 루트 페이지가 있음을 보여줍니다 .
인덱스 리프 페이지의 일반적인 행은 다음과 같습니다.
그리고 루트 페이지에서
그런 다음 실행 중 ...
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에 대한 다른 바이트와 함께 열 수에 대한 2 바이트가 포함됩니다.
여분의 행 너비로 인해 비 클러스터형 인덱스에는 이제 285 개의 리프 페이지와 루트 페이지와 함께 2 개의 중간 수준 페이지가 있습니다.
에 대한 실행 계획
ALTER TABLE Foo ALTER COLUMN B CHAR(1) NULL;
다음과 같이 보인다
이렇게하면 기존 색인을 업데이트하고 페이지를 분할하지 않고 새로운 색인 사본을 작성합니다.