증상
Microsoft SQL Server 2008, SQL Server 2012, SQL Server 2008 R2 또는 SQL Server 2014의 테이블에 대해 NOLOCK 힌트와 함께 복잡 한 UPDATE 문을 실행 하면 클러스터 되지 않은 인덱스가 손상 될 수 있습니다. 또한 SQL Server 오류 로그에 다음과 같은 오류 메시지가 기록 될 수 있습니다.
<날짜><> spid # 오류: 8646, 심각도: 21, 상태: 1. <날짜><시간> spid #에서는 ' <DATABASENAME> ' 데이터베이스에서 테이블 2102402659의 인덱스 ID 3에 있는 인덱스 항목을 찾을 수 없습니다. 표시 된 색인이 손상 되었거나 현재 업데이트 계획에 문제가 있습니다. DBCC CHECKDB 또는 DBCC CHECKTABLE를 실행 합니다. 문제가 지속 되 면 기술 지원에 문의 하세요><<. ' dbghelp ' 버전 ' 4.0.5 '을 사용 하 여> spid # <날짜><time> spid # * * Dump 스레드-Spid = 0, EC = 0x0000000BD70624C0<Date><time> spid # * * * Y:\MSSQL\MSSQL10. Date MSSQLSERVER\MSSQL\LOG\SQLDump0003.txt><2 날짜><시간> spid # * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * <날짜><Time시간> spid # * <날짜><시간> spid # * 시작 스택 덤프: <date><time> spid # * <날짜><spid # *> 날짜 <time><spid # * CPerIndexMetaQS:: errorabort-인덱스 손상><0 Date날짜><Date시간> Time spid # * TimeDate
참고표의 원본 테이블에 NOLOCK 힌트를 적용할 수 있습니다. 그러나, 명령문의 대상 표에는 NOLOCK 힌트를 적용할 수 없습니다.
원인
이 문제는 NOLOCK 참고로 인해 쿼리가 같은 값을 여러 번 읽을 때 테이블의 값을 올바르게 읽지 못하기 때문에 발생 합니다.
해결 방법
이 문제는 다음 SQL Server 누적 업데이트에서 처음 수정 되었습니다.
SQL Server 2014 누적 업데이트 1 /en-us/help/2931693
SQL Server 2012에 대 한 누적 업데이트 11 /en-us/help/2908007
SQL Server 2012 SP1 용 누적 업데이트 7 /en-us/help/2894115
SQL Server 2008 SP3 용 누적 업데이트 13 /en-us/help/2880350
SQL Server 2008 R2 SP2에 대 한 누적 업데이트 9 /en-us/help/2887606
각각의 새로운 새 누적 업데이트에는 이전 누적 업데이트에 포함 된 모든 핫픽스와 모든 보안 수정 사항이 포함 되어 있습니다. SQL Server에 대 한 최신 누적 업데이트를 확인 하세요.
상태
Microsoft는 "적용 대상" 절에 나열한 Microsoft 제품에서 이 문제를 확인했습니다.