데이터 이동으로 인해 NOLOCK으로 스캔을 계속할 수 없습니다


10

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

Could not continue scan with NOLOCK due to data movement

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

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

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

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


3
NOLOCK을 삭제하고 쿼리 / 인덱스 / 프로세스를 수정했습니다. 우리는 또한 볼 ... 물론 도움이 될 수 있습니다 en.wikipedia.org/wiki/Halloween_Problem
— GBN

3
@SQLKiwi : SQL 2012는 더티 스캔시 많은 데이터 이동에서 정상적으로 복구됩니다 (할당 순서로 다음 페이지에 계속).
— 레무스 루사 누

1
@ SQLKiwi : 예, 여전히 있습니다. 희소식 : 더티 스캔으로 뒷받침되는 커서도이를보다 정교하게 처리해야합니다.
— 레무스 루사 누

답변:


7

이것은 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있습니다.


우리는 그 픽스를 최신 상태로 유지했습니다. 플래그를 적용하고 다시 시작한 후에도 여전히 이러한 오류가 발생합니다.
— Ciaran Archer
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.