데이터 이동으로 인해 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.