큰 테이블의 속도 변경 열을 NON NULL로 증가


12

최근에 5 억 행에 가까운 테이블에 NULL 가능 비트 열을 추가했습니다. 열에는 기본값이 없지만 모든 삽입은 0 또는 1의 값을 지정하고 1 회 반복하여 모든 기존 행에 0 또는 1을 할당합니다 (작은 배치로 행 업데이트). 모든 행은 이제 해당 열에 0 또는 1이 있어야합니다.

비트 열을 Nullable로 만들려고하지만을 통해 시도했을 때 ALTER TABLE t1 ALTER COLUMN c1 bit not null3 분 동안 실행되기 시작했고 테이블에 대한 모든 읽기를 차단하고 있기 때문에 중지했으며 완료하는 데 시간이 오래 걸릴 것으로 의심되었습니다 . 시간이 오래 걸리지 않을 수는 있지만 사용하지 못할 위험이 너무 큽니다. 롤백 자체는 6 분이 걸렸습니다.

완료하는 데 몇 시간이 걸리지 않고 열을 널 입력 불가능하게 만드는 방법에 대한 제안이 있습니까? 또한 ALTER TABLE ALTER COLUMN내가 시작하고 취소 한 진술이 완료되는 데 걸리는 시간을 추정 할 수있는 방법이 있습니까?

SQL Server 2017 Web Edition을 사용하고 있습니다.

답변:


12

열 정의를 변경하는 대신 CHECK CONSTRAINT해당 열에 NULL을 허용하지 않는을 추가 할 수 있습니다 . 테이블을 계속 스캔해야하지만 모든 단일 데이터 페이지를 수정하지 않아도되므로 훨씬 빠른 작업이 가능합니다. 안타깝게도 작업 중에 Sch-M 잠금이 계속 유지됩니다. 제약 조건을 추가하기 전에 가능한 많은 테이블을 버퍼 풀로 가져 오는 것이 좋습니다. 이로 인해 Sch-M 잠금이 유지되는 시간이 줄어들 수 있습니다.

그런 다음 다음 유지 관리 기간 동안 제약 조건을 제거하고 열 정의를 변경할 수 있습니다.


아이디어 고마워 조. 나는 거의 체크 제약 조건을 추가했지만 주말 동안 유지 관리 기간이 있었고 열을 null이 아닌 것으로 변경할 수있었습니다. 그것이 도움이되었는지 확신 할 수 없지만 열을 널 입력 할 수 없게하기 직전에 테이블 데이터를 버퍼 풀로 가져 오려고하면 실행 SELECT c1, count(*) FROM t1 GROUP BY c1하는 데 약 9 분이 걸렸습니다. 그 ALTER TABLE ALTER COLUMN후의 실제 진술은 완료하는 데 25 분이 걸렸습니다. 나쁘지 않아.
벤 아마다

11

EE (Enterprise Edition)를 사용하는 경우 더 나은 전략은 NOT NULL기본값 0또는 1가장 일반적인 방법 으로 전략을 추가하는 것일 수 있습니다 .

이것은 EE메타 데이터 전용 변경입니다 . 그런 다음 뒤집어 야 할 것을 업데이트하십시오. 이는 업데이트가 적고 완료시 열 무효 성을 변경할 필요가 없음을 의미합니다. - 마틴 스미스


흥미롭게도 지난주에 SQL Developer Edition을 실행하는 로컬 컴퓨터의 동일한 큰 테이블에 null이 아닌 비트 열을 기본값으로 추가하는 것을 테스트했을 때이 기능을 발견했습니다. 열이 즉시 추가되어 이유를 알 수 없었습니다. . 나중에 개발자 에디션에 EE 기능이 포함되어 있어야합니다.
벤 아마다

-3

데이터를 새 테이블에 복사 한 다음 이름을 바꾸십시오. 모든 제약 조건과 색인을 관리해야합니다. SSMS 테이블 디자이너가 열을 다시 정렬하려고 할 때 수행하는 작업 (예 :)이지만 올바르게 보이지 않는 것이 있는지 스크립트를 확인해야합니다.

복사하는 동안 소스 테이블에 대한 읽기 액세스는 문제가되지 않지만 쓰기가있는 경우 격리 레벨에 따라 차단되거나 복사되지 않을 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.