증상
Microsoft SQL Server 2012 또는 SQL Server 2014의 테이블에 열을 추가 한다고 가정 합니다. 행의 크기가 8060 바이트에 허용 되는 최대 크기와 가까운 경우 추가 작업에 시간이 오래 걸릴 수 있습니다.
원인
이 문제는 행의 총 크기가 최대 허용 행 크기에 근접 한 경우 SQL Server는 테이블의 전체 검사를 수행 하 여 새 열을 추가 해도 데이터 무결성을 위반 하지 않도록 합니다. SQL Server 2012 이전의 버전은이 검사를 수행 하지 않으며 DDL (데이터 정의 언어)이 더 빠르게 실행 되도록 합니다. 그러나이 동작은 행의 크기가 허용 되는 크기를 초과 하는 경우 행을 업데이트 하거나 축소 하는 등의 후속 작업에 오류가 발생 합니다.
해결 방법
누적 업데이트는 이전 버전과의 호환성 동작을 위한 새로운 추적 플래그 647을 소개 합니다. 이 문제는 다음 SQL Server 누적 업데이트에서 처음 수정 되었습니다.
SQL Server 2014 누적 업데이트 5 /en-us/help/3011055
SQL Server 2012 SP1 용 누적 업데이트 12 /en-us/help/2991533
SQL Server 2012 SP2에 대 한 누적 업데이트 2 /en-us/help/2983175
각각의 새로운 새 누적 업데이트에는 이전 누적 업데이트에 포함 된 모든 핫픽스와 모든 보안 수정 사항이 포함 되어 있습니다. SQL Server에 대 한 최신 누적 업데이트를 확인 하세요.
추가 정보
-
시작 매개 변수를 사용 하 여 추적 플래그 647를 설정할 수 있습니다. 자세한 내용은 데이터베이스 엔진 서비스 시작 옵션을 참조 하세요.
-
다음 쿼리를 실행할 수 있습니다 (<테이블 이름> 실제 테이블 이름으로 바꿈) 하 여 프로덕션 시스템에서 작업 전에 특정 테이블을 테스트 하 고이 문제의 영향을 계획 하세요. 결과가 8060 보다 큰 경우 표에이 문제가 적용 됩니다. 또한 열을 삭제 한 경우에는 다시 작성 옵션을 사용 하 여 테이블을 변경 해야 합니다. 테이블을 다시 빌드하면 쿼리를 통해 올바른 결과가 반환 될 수 있습니다.
select 1+1+2 + 2 + (case when sum (case when leaf_offset < 0 then 1 else 0 end) > 0 then 2 else 0 end) + ( (count (*) + 7)/8 ) + count (case when leaf_offset < 0 then 1 else null end) * 2 + sum( case when max_length=-1 then 24 else max_length end) from sys.system_internals_partition_columns col join sys.partitions par on col.partition_id = par.partition_id where object_id = object_id ('<table name>') and index_id in (0,1) and partition_number =1
-
응용 프로그램이 자주 테이블에 새 열을 추가 하는 경우 가변 길이 열 또는 스파스 열을 추가 하는 것이 좋습니다. 모든 열의 총 크기가 8060 바이트를 초과 하는 경우에도 메타 데이터 전용 작업입니다.
상태
Microsoft는 "적용 대상" 절에 나열한 제품에서 이 문제를 확인했습니다.