기본 제약 조건으로 NOT NULL 열을 추가하는 이유는 무엇입니까?


16
CREATE TABLE TestTab (ID INT IDENTITY(1,1), st nvarchar(100))

INSERT INTO TestTab (st) values ('a')
INSERT INTO TestTab (st) values ('b')
INSERT INTO TestTab (st) values ('c')
INSERT INTO TestTab (st) values ('d')
INSERT INTO TestTab (st) values ('e')

INSERT INTO TestTab (st) SELECT TOP 10000 st from testtab
GO 30

ALTER TABLE TestTab ADD newcol nvarchar(10) DEFAULT 'newcol'
UPDATE TestTab SET newcol = 'newcol'  --6 sec
ALTER TABLE TestTab ADD newcol1 nvarchar(10) DEFAULT 'newcol1' NOT NULL

DROP TABLE TestTab

이 테스트 스크립트를 실행하면 ALTERwith UPDATE가 6 초가 걸리므로 이해할 수 있습니다.

그러나 ALTERwith with DEFAULT NOT NULL는 훨씬 더 큰 테이블에서도 즉시 실행됩니다. 이것이 순간적인 이유에 대한 설명이 있습니까? 물리 디스크에서 여전히 모든 행에 데이터를 써야합니까?

SET STATISTICS IO ON쿼리 계획을 살펴 보았지만 DDL 작업에 사용할 수없는 것 같습니다.

답변:


23

예, NOT NULL을 가진 열을 추가하고 기본값은 변경시 실제로 모든 행에 값을 쓰지 않으므로 더 이상 데이터 크기 연산이 아닙니다. 테이블에서 선택하면 실제로 sys.system_internals_partition_columns 에서 열이 구체화되어 모든 값을 쓸 때까지 변경할 수 없습니다 (변경 될 때까지). 모든 데이터 유형에 적용되는 것은 아니며 Enterprise Edition이 필요합니다.

레무스 루사 누 (Remus Rusanu) 는이를 자세히 설명한다.

또한 ALTER최소한 SQL Server에서 계획을 생성하지 않으므로 계획을 표시 할 수 없지만 I / O를 보려면 SQL Sentry Plan Explorer를 사용할 수 있습니다 . *이 스크린 샷은 c5 열 추가를 보여줍니다. LOB 유형이 지원되지 않으므로 위에서 설명한대로 "온라인"을 입력 한 다음 c6, "오프라인"열을 추가하십시오. I / O가 주로 쓰기보다는 읽기로 표시되는 것을 볼 수 있지만 더 중요한 것은 UPDATE오프라인 변경과 관련된 (잘못된!) 입니다.

온라인 및 오프라인 변경에 대한 I / O

Enterprise Edition이없는 경우 두 명령문 모두 2 차 UPDATE및 2 차 부속이 첨부됩니다. (그리고 전체 쿼리 호출 스택을 얻지 못하는 무료 버전의 Plan Explorer를 사용하는 경우 위의 내용이 표시되지 않습니다. 빈 명령문 트리 만 표시됩니다. 전체 쿼리를 보려면 유료 버전이 필요합니다 콜 스택.)

SQL Server는 예상 계획 을 생성 하지만 그다지 유용하지는 않습니다. 조금도. 온라인 변경에 대한 예상 계획은 오프라인 변경에 대한 예상 계획과 동일합니다.

온라인 변경 계획 다이어그램

* 면책 조항 : SQL 센트리에 대한 I 작동합니다.


4
+1 : 예. "엔터프라이즈 판". 나는 왜 내 고객 사이트 중 일부에서 작동하지 않는지 항상 궁금했습니다.
RBarryYoung
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.