데이터 이동으로 인해 NOLOCK으로 스캔을 계속할 수 없습니다 개 이상의 테이블을 조인하는 복잡한 쿼리입니다.

SQL Server 2000을 실행하면 매일 밤 이러한 오류가 발생합니다.

Could not continue scan with NOLOCK due to data movement

이 오류를 발생시키는 쿼리는 12 개 이상의 테이블을 조인하는 복잡한 쿼리입니다. 기본 데이터는 자주 업데이트 할 수 있습니다.

문화적 ‘모범 사례’는 과거에 NOLOCK힌트를 도입 하면 성능이 향상되고 동시성이 향상 되었다는 것 입니다. 이 쿼리는 100 % 정확할 필요는 없습니다. 즉, 더티 (dirty) 읽기 등을 허용 할 것입니다. 그러나 이러한 잠금 힌트가 모두 있어도 데이터베이스에서이 오류가 발생하는 이유를 이해하기 위해 고심하고 있습니다.

누구나 이것에 약간의 빛을 비출 수 있습니까-부드럽게, 나는 실제로 DBA가 아닌 프로그래머입니다. 🙂

추신 : 아래에 언급 된 수정 사항을 적용했습니다 : http://support.microsoft.com/kb/815008



답변

이것은 SQL Server 2000에서 잘 알려진 문제입니다. 기본적으로 프로세스 B가 검사를 수행하는 동안 프로세스 A가 행 A를 삭제 한 경우 (B에서 READ UNCOMMITTED또는에서 WITH (NOLOCK)) 프로세스 B가 “이 데이터에 대해 발생한 일” “읽으려고 할 때. 보다 정확하게는 프로세스 B가 인덱스를 읽은 후 데이터 행을 읽으려고 시도하기 전에 행을 삭제해야합니다.

크레이그 프리드먼 (Craig Freedman)

다행히도 수정은 비교적 간단합니다. http://support.microsoft.com/kb/815008

그래도 문제가 해결되지 않으면 모든 WITH (NOLOCK)힌트 를 제거하고 트랜잭션 격리 수준을 위의 값으로 설정 하는 약간 더 고통스러운 옵션이 READ UNCOMMITTED있습니다.