열을 NOT NULL로 변경하면 NULL 값이 없더라도 SQL Server는 모든 단일 페이지 를 터치 해야합니다. 채우기 비율에 따라 실제로 많은 페이지 분할이 발생할 수 있습니다. 물론 만지는 모든 페이지는 기록되어야하며, 분할로 인해 많은 페이지에 대해 두 가지 변경 사항이 기록되어야 할 것으로 생각됩니다. 그러나 모두 단일 패스로 수행되므로 로그는 모든 변경 사항을 처리해야하므로 취소를 누르면 취소 할 내용을 정확하게 알 수 있습니다.
예입니다. 간단한 테이블 :
DROP TABLE dbo.floob;
GO
CREATE TABLE dbo.floob
(
id INT IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED,
bar INT NULL
);
INSERT dbo.floob(bar) SELECT NULL UNION ALL SELECT 4 UNION ALL SELECT NULL;
ALTER TABLE dbo.floob ADD CONSTRAINT df DEFAULT(0) FOR bar
이제 페이지 세부 사항을 봅시다. 먼저 우리가 다루고있는 페이지와 DB_ID를 찾아야합니다. 제 경우에는이라는 데이터베이스를 만들었고 foo
DB_ID는 5였습니다.
DBCC TRACEON(3604, -1);
DBCC IND('foo', 'dbo.floob', 1);
SELECT DB_ID();
출력 결과는 159 페이지에 관심이 있음을 나타냅니다 (의 유일한 DBCC IND
출력 행 PageType = 1
).
이제 OP 시나리오를 단계별로 진행하면서 일부 페이지 세부 정보를 살펴 보겠습니다.
DBCC PAGE(5, 1, 159, 3);
UPDATE dbo.floob SET bar = 0 WHERE bar IS NULL;
DBCC PAGE(5, 1, 159, 3);
ALTER TABLE dbo.floob ALTER COLUMN bar INT NOT NULL;
DBCC PAGE(5, 1, 159, 3);
이제는 내부 전문가가 아니기 때문에 이에 대한 답변이 없습니다. 그러나 업데이트 작업과 NOT NULL 제약 조건을 추가하면 페이지에 명백하게 쓸 수 있지만 후자는 완전히 다른 방식으로 수행됩니다. Null을 허용하지 않는 열을 Null을 허용하지 않는 열로 교체하여 비트 만 사용하는 것이 아니라 레코드의 구조를 실제로 변경하는 것 같습니다. 그것이 그렇게 해야하는 이유는 확실하지 않습니다 . 스토리지 엔진 팀 에게 좋은 질문입니다 . SQL Server 2012는 이러한 시나리오 중 일부를 훨씬 더 잘 처리한다고 믿습니다. FWIW-아직 철저한 테스트를 수행하지 않았습니다.
NOT NULL
메타 데이터 작업으로 기본값을 사용하여 열 을 추가하는 기능 이 추가 되었습니다. 또한에서 "온라인 작업으로 NULL NOT 열 추가"를 참조 문서 .