문제

나는 웹 사이트와 응용 프로그램을 만드는 사업을하고 있습니다. ~ 아니다 미션 크리티컬 -> 예 : 뱅킹 소프트웨어, 우주 비행, 집중 치료 모니터링 응용 프로그램 등. 아이디어를 얻을 수 있습니다.

그래서 그 대규모 면책 조항으로 일부 SQL 문에서 Nolock 힌트를 사용하는 것은 나쁜가요? 몇 년 전, 동료 SQL 관리자는 "더러운 읽기"에 만족하면 Nolock을 사용해야한다고 제안했습니다. 테이블/행/무엇이든.

나는 또한 내가 죽은 사람을 경험한다면 훌륭한 해결책이라고 들었습니다. 그래서 나는 SQL Guru가 임의의 코드로 나를 도와 줄 때까지 몇 년 동안 그 생각을 따르기 시작했고 내 SQL 코드의 모든 Nolocks를 발견했습니다. 나는 정중하게 꾸짖으며 그는 나에게 그것을 설명하려고 노력했다 (왜 좋은 일이 아님) 나는 잃어 버렸다. 나는 그의 설명의 본질은 '더 심각한 문제에 대한 반창고 솔루션이라고 생각했다. 특히 교착 상태를 경험하는 경우. 따라서 문제의 근본을 수정하십시오. '

나는 최근에 그것에 대해 인터넷 검색을했고 이 게시물.

그래서 SQL DB Guru Sensei가 나를 깨달아 주시겠습니까?

도움이 되었습니까?

해결책

Nolock 힌트를 사용하면 거래 격리 수준이 SELECT 진술입니다 READ UNCOMMITTED. 이는 쿼리가 더럽고 일관성이없는 데이터를 볼 수 있음을 의미합니다.

이것은 일반적으로 신청하는 것이 좋은 생각이 아닙니다. 이 더러운 읽기 동작이 Mission Critical Web 기반 응용 프로그램에 적합하더라도 Nolock 스캔은 601 오류를 유발할 수 있으며, 이로 인해 잠금 보호 부족의 결과로 데이터 이동으로 인해 쿼리가 종료됩니다.

나는 독서를 제안한다 스냅 샷 격리가 도움이 될 때 그리고 아프면 -MSDN은 대부분의 상황에서 스냅 샷 대신 Read Commited Snapshot을 사용하는 것이 좋습니다.

다른 팁

스택 오버플로 작업을하기 전에 NOLOCK 교장에서 잠재적으로 수행 할 수 있습니다 SELECT ~와 함께 NOLOCK 날짜가 오래 걸리거나 일관되지 않은 데이터로 결과를 되 찾으십시오. 생각해야 할 요소는 동시에 다른 프로세스가 동일한 테이블에서 데이터를 선택할 수있는 동시에 몇 개의 레코드를 삽입/업데이트 할 수 있다는 것입니다. 이런 일이 많이 발생하면 데이터베이스 모드를 사용하지 않는 한 교착 상태가 높습니다. READ COMMITED SNAPSHOT.

나는 그 후 사용에 대한 나의 관점을 바꿨다. NOLOCK 그것이 어떻게 개선 될 수 있는지 목격 한 후 SELECT 성능은 물론 대량로드 된 SQL 서버의 교착 상태를 제거합니다. 데이터가 정확히 100% 커밋되지 않았다는 것을 신경 쓰지 않을 수도 있고 현재 구식이라도 신속하게 결과가 필요합니다.

사용을 생각할 때 스스로에게 질문하십시오 NOLOCK:

내 쿼리에는 많은 수의 테이블이 포함되어 있습니까? INSERT/UPDATE 명령 및 쿼리에서 반환 된 데이터가 주어진 순간에 이러한 변경 사항을 누락했는지 신경 쓰나요?

대답이 아니오 인 경우 사용하십시오 NOLOCK 성능을 향상시키기 위해.


방금 빠른 검색을 수행했습니다 NOLOCK 스택 오버 플로우에 대한 코드베이스 내의 키워드 및 138 인스턴스를 찾았으므로 몇 곳에서 사용합니다.

더러운 읽기에 관심이 없다면 (예 : 주로 읽기 상황에서) NOLOCK 괜찮습니다.

하지만, 잠금 문제의 대부분은 쿼리 워크로드에 대한 '올바른'인덱스가 없기 때문입니다 (하드웨어가 작업에 달려 있음).

그리고 전문가의 설명은 옳았습니다. 일반적으로 더 심각한 문제에 대한 반창고 솔루션입니다.

편집하다: 나는 Nolock을 사용해야한다고 제안하지 않습니다. 나는 분명히 명확하게 만들었을 것 같아요. (나는 그것이 괜찮다는 것을 분석 한 극단적 인 상황에서는 그것을 사용할 것입니다). 예를 들어, 잠시 후 나는 잠금 문제를 완화시키기 위해 Nolock으로 뿌려진 일부 TSQL을 작업했습니다. 나는 그것들을 모두 제거하고 올바른 색인을 구현했으며 모든 교착 상태가 사라졌습니다.

의심 의심은 교통량이 많은 경험을 한 "전문가"라는 것을 의심합니다 ...

웹 사이트는 일반적으로 사람이 완전히로드 된 페이지를 볼 때까지 "더러운"입니다. 데이터베이스에서로드 한 다음 편집 된 데이터를 저장하는 양식을 고려하십시오. 사람들이 더러운 읽기에 대해 계속하는 방식은 바보입니다.

즉, 선택 사항에 여러 개의 레이어를 구축하면 위험한 중복성으로 건축 할 수 있습니다. 돈이나 상태 시나리오를 다루고 있다면 거래 데이터를 읽거나 쓰는 것뿐만 아니라 적절한 동시성 솔루션 (대부분의 "전문가"가 귀찮게하지 않아야합니다).

반면에, 웹 사이트에 대한 고급 제품 검색이 있다면 (즉, 캐시되지 않고 약간 집중적이지 않은 것), 동시 사용자가 몇 명 이상인 사이트를 구축 한 적이 있습니다 (Phenominal 수는 몇 명입니다. "전문가"는 그렇지 않음), 그 뒤에 다른 모든 과정을 병에 넣는 것은 열렬한 일입니다.

그것이 무엇을 의미하는지 알고 적절할 때 사용하십시오. 데이터베이스는 요즘 거의 항상 주요 병 목가 될 것이며 Nolock을 사용하는 것에 대해 똑똑하면 수천 명의 인프라를 절약 할 수 있습니다.

편집하다: 그것은 단지 그것이 도움이되는 교착 상태가 아니라, 당신이 끝날 때까지 다른 사람들이 기다리게하거나 그 반대도 마찬가지입니다.

EF4에서 Nolock 힌트 사용?

대답은 잘못되었지만 약간 혼란 스러울 수도 있습니다.

  • 단일 값/행을 쿼리 할 때는 다음과 같습니다 언제나 Nolock을 사용하는 나쁜 관행 - 잘못된 정보를 표시하거나 잘못된 데이터에 대한 조치를 취하고 싶지 않을 것입니다.
  • 거친 통계 정보를 표시 할 때 Nolock은 매우 유용 할 수 있습니다. 예를 들어보세요 : 자물쇠를 읽는 것은 말도 안됩니다. 정확한 질문의 견해 수 또는 태그에 대한 정확한 질문 수. 당신이 "SQL-Server"로 태그가 지정된 3360 질문을 잘못 알려주는 경우에는 아무도 신경 쓰지 않습니다. 거래 롤백으로 인해 3359는 1 초 후에 질문합니다.

전문 개발자로서 나는 그것이 의존한다고 말합니다. 그러나 나는 확실히 GATS와 OMG Ponies의 조언을 따릅니다. 당신이 무엇을하고 있는지 알고, 그것이 언제 도움이되고, 언제 아프고, 언제 아프고,

읽다 힌트 및 기타 가난한 아이디어

SQL Server를 더 깊이 이해하게 만드는 것은 무엇입니까? 나는 일반적으로 SQL 힌트가 사악하다는 규칙을 따르지만 불행히도 나는 매번 그것들을 사용하고 SQL Server가 일을 강요하는 데 지친 경우 ...하지만 드문 경우입니다.

루크

App-Support가 SSMS를 사용하여 생산 서버에서 광고 호크 쿼리에 답변하고 싶을 때 (보고를 통해 제공되지 않은) Nolock을 사용하도록 요청했습니다. 그렇게하면 '메인'사업이 영향을받지 않습니다.

나는 Nolock 힌트, 특히 "적절한 경우 사용"이라는 말에 동의합니다. 응용 프로그램이 잘못 작성되고 동시성 부적절한 방법을 사용하는 경우 - 잠금 에스컬레이션이 발생할 수 있습니다. 높은 거래 테이블도 성격으로 인해 항상 잠겨 있습니다. 인덱스 적용이 양호한 것은 데이터 검색에 도움이되지 않지만 분리 수준을 설정하여 커밋되지 않은 것을 읽습니다. 또한 Nolock을 사용하는 것은 변화의 특성을 예측할 수있는 경우 많은 경우에 안전하다고 생각합니다. 예를 들어 - 여행자와의 작업이 많은 측정 삽입으로 다양한 프로세스를 진행할 때 Nolock 힌트를 사용하여 완성 된 작업에 대해 쿼리를 안전하게 실행할 수 있으며,이 방법 으로이 방법으로 승진 또는 독점적 인 잠금 장치를 테이블 위에 놓는 다른 세션과 충돌하지 않도록합니다. /페이지. 이 경우에 액세스 할 수있는 데이터는 정적이지만 수백만 개의 레코드와 분당 수천 개의 업데이트/인서트가있는 매우 거래 테이블에 상주 할 수 있습니다. 건배

나는 Nolock을 사용하는 것이 사실상 결코 맞지 않는다고 생각합니다.

단일 행을 읽는 경우 올바른 인덱스는 개별 행 조치가 빠르게 완료되면 NOLOCK이 필요하지 않음을 의미합니다.

임시 디스플레이 이외의 다른 행에 대해 많은 행을 읽고 결과를 반복하거나 생성 된 숫자로 방어 할 수있는 것에 관심을 갖는 경우 Nolock은 적절하지 않습니다.

Nolock은 "이 답변이 중복 행, 삭제 된 행 또는 롤백으로 인해 시작하지 않은 행이 포함되어 있는지 상관하지 않습니다"에 대한 대리 태그입니다.

Nolock에서 가능한 오류 :

  • 일치하는 행은 전혀 반환되지 않습니다.
  • 단일 행이 여러 번 반환됩니다 (동일한 기본 키의 여러 인스턴스 포함)
  • 일치하지 않는 행이 반환됩니다.

Nolock Select가 실행되는 동안 페이지 분할을 일으킬 수있는 모든 작업으로 인해 이러한 작업이 발생할 수 있습니다. 거의 모든 조치 (삭제조차도)는 페이지 분할을 유발할 수 있습니다.

따라서 : 실행 중에 행이 변경되지 않는다는 것을 "알고 있다면"인덱스가 효율적인 검색을 허용하므로 Nolock을 사용하지 마십시오.

쿼리가 실행되는 동안 행이 변경 될 수 있고 정확도에 관심이있는 경우 Nolock을 사용하지 마십시오.

교착 상태로 인해 Nolock을 고려하고 있다면 예상치 못한 테이블 스캔에 대한 쿼리 계획 구조를 검사하고 교착 상태를 추적하고 발생 이유를 확인하십시오. Nolock 주변의 쓰기는 이전에 교착 상태에 빠진 쿼리가 잠재적으로 잘못된 답을 쓸 것임을 의미 할 수 있습니다.

가능하면 더 나은 솔루션은 다음과 같습니다.

  • 데이터 (로그 재현 사용)를보고 데이터베이스에 복제하십시오.
  • SAN 스냅 샷을 사용하고 일관된 버전의 DB를 마운트하십시오.
  • 더 나은 기본 트랜잭션 격리 수준이있는 데이터베이스를 사용하십시오.

MS가 Oracle에 대한 판매를 잃어 버렸기 때문에 스냅 샷 트랜잭션 격리 수준이 생성되었습니다. Oracle 은이 문제를 피하기 위해 실행 취소/Redo 로그를 사용합니다. Postgres는 MVCC를 사용합니다. 미래에 MS의 Heckaton은 MVCC를 사용할 것이지만, 이는 생산 준비가되지 않았다.

Nolock은 종종 데이터베이스 읽기 속도를 높이기위한 마법의 방법으로 악용되지만 가능한 언제든지 사용하지 않으려 고 노력합니다.

결과 세트에는 아직 커밋되지 않은 행이 포함될 수 있으며, 종종 나중에 롤백됩니다.

오류 또는 결과 세트가 비어 있거나, 줄이 없거나 동일한 행을 여러 번 표시 할 수 있습니다.

다른 트랜잭션이 데이터를 읽는 동시에 데이터를 이동하기 때문입니다.

Committed 읽기 여러 사용자가 동일한 셀을 동시에 변경하는 단일 열 내에서 데이터가 손상되는 추가 문제가 추가됩니다.

이미 작성된 시스템을 만나고 테이블에 인덱스를 추가 한 다음 14GIG 데이터 테이블의 데이터로드를 급격히 느리게하는 실제 생활에서, 언젠가는 보고서에 NOLOCK과 함께 사용해야합니다. , count 등)는 행, 페이지, 테이블 잠금을 수행하지 않으며 전체 성능을 방지합니다. 새로운 시스템에서 쉽게 말할 수있는 것은 Nolock 및 사용 인덱스를 사용하지 않지만 인덱스를 추가하면 데이터로드가 심각하게 다운 그레이드되고, 말하면, 코드베이스를 변경하여 인덱스를 삭제 한 다음 벌크로드를 변경 한 다음 인덱스를 재현합니다. 새로운 시스템을 개발하고 있다면 모두 훌륭하고 좋습니다. 그러나 이미 시스템이 설치되어있는 경우는 아닙니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top