선택 쿼리에 대한 NOLOCK
일부 큰 작업에서 "데이터 이동으로 인해 스캔을 계속할 수 없습니다 "라는 메시지가 표시되는 경우가 있습니다 WITH (NOLOCK)
.
나는 페이지 분할이있을 때 데이터를 더 이상 원래의 위치에 두지 않았을 때 데이터를 선택하려고 시도하는 것과 관련이 있음을 이해합니다. 내 환경에서 일어나는 일이라고 가정합니다.
이것을 어떻게 재현합니까?
오류를 포착 하고이 문제가 발생하면 다시 시도하기 위해 단기 해결 방법을 시도하고 있지만 오류를 재현 할 수 없으면 테스트 할 수 없습니다. 이것을 일으키는 합리적으로 신뢰할 수있는 방법이 있습니까?
이런 일이 발생하면 쿼리를 다시 실행하면 성공하게되므로 실제 데이터 나 데이터베이스가 영구적으로 손상 될 염려는 없습니다. 쿼리의 일부 테이블 (인덱스와 함께)이 자주 삭제, 재 작성 및 다시 채워 지므로 이와 관련된 것으로 가정합니다.
제거하는 NOLOCK
것이 장기적인 문제입니다. 그 이유 NOLOCK
는 쿼리가 너무 나빠서 일일 트랜잭션으로 NOLOCK
교착 상태에 빠졌기 때문에 교착 상태를 막기위한 반창고 (작동 한) 이기 때문 입니다. 그래서 영구적 인 해결책을 찾을 수있을 때까지 반창고에 반창고가 필요합니다.
Hello World로 복제 할 수 있다면 1 시간 이내에 반창고를 업무에 옮길 계획입니다. NOLOCK
앱 교착 상태를 다시 시작하기 때문에 검색 및 교체 제거를 수행 할 수 없습니다 . 이는 때때로 실패한 작업보다 나에게 좋지 않습니다.
커밋 된 읽기 스냅 샷 격리를 사용하는 것이 좋습니다. 자세한 내용을 확인하려면 데이터베이스 팀과 협력해야합니다. 우리의 문제 중 하나는 우리가 SQL Server 전문가가 그런 종류의 일을 처리하지 못한다는 것입니다. 그리고 지금 당장 그러한 변경을 할 정도로 격리 수준을 충분히 이해하지 못하고 있습니다.
DEADLOCK_PRIORITY
에 LOW
응용 프로그램을 교착 상태가있는 경우, 작업이 실패 할 수 있도록, 작업에, 그리고. 그 후에 교착 상태를 조사하고 그 원인이 발생하는 이유를 찾아 해당 문제를 해결할 수 있습니다. 두 문장의 순서를 바꾸는 것과 같이 매우 간단한 수정 일 수 있습니다. 문제가 무엇이든간에 해결책NOLOCK
이 아니므로 가장 쉬운 방법이므로 강제로 시도 하지 마십시오 .
NOLOCK
이 작업에서 단순히 제거하는 것을 고려 했습니까 ? 이 쿼리의 결과가 정확해야한다면 601은 걱정할 것이 가장 적어야합니다 . 폴 화이트 (Paul White)는 여기서는 불가능한 데이터 읽기의 끔찍한 예를 보여줍니다 .