@ypercube의 답변 은 메타 데이터 전용 변경으로 이것을 부분적으로 관리합니다.
제약 조건을 추가 NOCHECK
한다는 것은 행을 읽을 필요가 없다는 것을 의미하며 열에 NULL
값이 포함되지 않은 위치에서 시작하는 경우 (그리고 제약 조건을 확인하고 추가하는 사이에 아무것도 추가되지 않는 경우) 제약 조건으로 인해 NULL
미래 INSERT
또는 UPDATE
작업 에서 값이 생성되지 않으므로 작동합니다.
그러나 제약 조건을 추가하면 동시 트랜잭션에 여전히 영향을 줄 수 있습니다. 는 ALTER TABLE
취득해야합니다 Sch-M
먼저 잠금을. 이를 기다리는 동안 다른 모든 테이블 액세스는 여기에 설명 된 대로 차단 됩니다 .
그러나 일단 Sch-M
잠금이 획득되면 작업이 매우 빨라야합니다.
이것의 한 가지 문제점은 실제로 컬럼에 NULL
s 가 없다는 것을 알고 있더라도 쿼리 최적화 프로그램이 제한 조건을 신뢰하지 않으므로 계획이 최적이 아님을 의미합니다.
CREATE TABLE T (X INT NULL)
INSERT INTO T
SELECT ROW_NUMBER() OVER (ORDER BY @@SPID)
FROM master..spt_values
ALTER TABLE T WITH NOCHECK
ADD CONSTRAINT X_NOT_NULL
CHECK (X IS NOT NULL) ;
SELECT *
FROM T
WHERE X NOT IN (SELECT X FROM T)
이것을 더 간단한 것과 비교하십시오
ALTER TABLE T ALTER COLUMN X INT NOT NULL
SELECT *
FROM T
WHERE X NOT IN (SELECT X FROM T)
이 방법으로 열 정의를 변경하면 발생할 수있는 한 가지 문제점은 모든 행을 읽어서 조건을 충족하는지 확인해야 할뿐만 아니라 실제로 행에 대한 로그 업데이트를 수행 할 수 있다는 것 입니다.
가능한 절반 방법은 점검 제한 조건을 추가하는 것 WITH CHECK
입니다. WITH NOCHECK
모든 행을 읽어야하는 것 보다 속도가 느리지 만 쿼리 최적화 프로그램이 위의 쿼리에서 더 간단한 계획을 제공 할 수 있으므로 기록 된 업데이트 문제가 발생하지 않아야합니다.