복붙노트

[SQL] NOLOCK (SQL 서버 힌트) 나쁜 관행인가?

SQL

NOLOCK (SQL 서버 힌트) 나쁜 관행인가?

예> - 나는 웹 사이트 및 미션 크리티컬하지 않은 응용 프로그램을 만드는 사업입니다. 금융 소프트웨어, 우주 비행, 중환자 모니터링 응용 프로그램 등 당신은 아이디어를 얻을.

그래서, 대규모의 부인으로, 나쁜 일부 SQL 문에 NOLOCK 힌트를 사용하여 무엇입니까? 다수 년 전에, 그것은 내가 각 읽기가를 고정하지 않기 때문에 내 시스템에서 나에게 조금 더 성능을 제공하는 "더러운 읽기"행복 해요 만약 내가 NOLOCK을 사용해야 동료는 SQL 관리자에 의해 제안되었다 테이블 / 행 / 뭐든간에.

나는 또한 죽은 잠금을 겪고있어 경우에 훌륭한 솔루션입니다 들었다. 그래서, 난은 SQL 전문가는 어떤 임의의 코드 나에게 도움이 될 때까지 몇 년 동안 그 생각을 다음 시작하고 내 SQL 코드의 모든 NOLOCKS 나타났습니다. 나는 정중하게 야단 된 그는 (그것은 좋은 일이 아니에요 이유) 나에게 그것을 설명하기 위해 노력하고 내가 잃었어요 셈 이죠. 나는 그의 설명의 본질이 '이었다 당신이 교착 상태가 발생하는 경우 특히 .. 더 심각한 문제에 반창고 솔루션입니다 느꼈다. 따라서, '문제의 근본을 해결.

좀 최근에 대한 인터넷 검색을했고,이 게시물을 가로 질러왔다.

그래서, 일부 SQL DB 전문가 선생님의 가르치 려 주실 래요?

해결법

  1. ==============================

    1.NOLOCK 힌트로, SELECT 문에 대한 트랜잭션 격리 수준은 READ UNCOMMITTED입니다. 쿼리가 더럽고 일치하지 않는 데이터를 볼 수 있음이 의미합니다.

    NOLOCK 힌트로, SELECT 문에 대한 트랜잭션 격리 수준은 READ UNCOMMITTED입니다. 쿼리가 더럽고 일치하지 않는 데이터를 볼 수 있음이 의미합니다.

    이 원칙적으로 적용하는 것은 좋은 생각이 아니다. 이 더러운 행동이 당신의 미션 크리티컬 한 웹 기반 응용 프로그램에 대한 확인을 읽기 경우에도 NOLOCK 스캔으로 인해 보호 잠금의 부족의 결과로 데이터 이동에 쿼리를 종료합니다 (601) 오류가 발생할 수 있습니다.

    스냅 샷 격리가 도움 언제 읽어 보시기 바랍니다 그리고 그것은 아파 경우 - MSDN은 READ 대부분의 상황에서 스냅보다는 스냅 샷을 COMMITTED 사용하는 것이 좋습니다.

  2. ==============================

    2.스택 오버플로 작업을하기 전에, 당신이 잠재적으로 NOLOCK와 SELECT를 수행하고 날짜 또는 일관성이 밖으로 할 수있는 데이터와 결과를 다시 얻을 수있는 교장에 NOLOCK 반대했다. 에 대해 생각하는 요소는 다른 프로세스가 같은 테이블에서 데이터를 선택 할 수있다 동시에 업데이트 / 삽입 할 수 있습니다 얼마나 많은 기록이다. 이 많이 발생하는 경우는 READ 최선을 다하고 스냅 샷으로 데이터베이스 모드를 사용하지 않으면 다음 교착 상태의 높은 가능성이있다.

    스택 오버플로 작업을하기 전에, 당신이 잠재적으로 NOLOCK와 SELECT를 수행하고 날짜 또는 일관성이 밖으로 할 수있는 데이터와 결과를 다시 얻을 수있는 교장에 NOLOCK 반대했다. 에 대해 생각하는 요소는 다른 프로세스가 같은 테이블에서 데이터를 선택 할 수있다 동시에 업데이트 / 삽입 할 수 있습니다 얼마나 많은 기록이다. 이 많이 발생하는 경우는 READ 최선을 다하고 스냅 샷으로 데이터베이스 모드를 사용하지 않으면 다음 교착 상태의 높은 가능성이있다.

    나는 이후뿐만 아니라 대량로드 SQL Server에서 교착 상태를 제거대로 SELECT 성능을 개선 할 수있는 방법을 목격 한 후 NOLOCK의 사용에 대한 내 관점을 변경했습니다. 이 당신이 당신의 데이터가 정확히 100 % 최선을 다하고 아니라고 걱정하지 않을 수 시간은 당신은 유효 기간이 될 수있다하더라도 다시 결과를 빠르게해야합니다.

    NOLOCK을 사용 생각할 때 자신에게 질문 :

    답이없는 경우, 성능을 향상시키기 위해 NOLOCK을 사용하지 않습니다. 난 그냥 스택 오버플로의 코드베이스 내에서 NOLOCK 키워드에 대한 빠른 검색을 수행하고 우리는 꽤 많은 곳에서 사용할 수 있도록, 138 개 인스턴스를 발견했다.

  3. ==============================

    3.더러운 읽기에 대해 당신이 (즉, 주로 READ 상황에서) 걱정하지 않는 경우, NOLOCK 괜찮습니다.

    더러운 읽기에 대해 당신이 (즉, 주로 READ 상황에서) 걱정하지 않는 경우, NOLOCK 괜찮습니다.

    하지만, 잠금 문제의 대부분은 (하드웨어 작업까지입니다 가정) 쿼리 워크로드에 대한 '올바른'인덱스를 가지고 있지에 의한 것을주의하십시오.

    그리고 전문가의 설명은 정확했다. 그것은 일반적으로 더 심각한 문제에 반창고 솔루션입니다.

    편집 : 나는 확실히 NOLOCK 사용하는 것을 제안하고 있지 않다. 나는 분명히 취소 있음을 했어야 같아요. (나는 오직 내가이 OK라고 분석했다 극단적 인 상황에서, 그것을 사용한다). 예를 들어, NOLOCK를 뿌리고 있었다 나는 몇 가지 TSQL에서 일 동안 다시 시도하고 잠금 문제를 완화합니다. 나는 그들 모두를 제거 올바른 인덱스를 구현하고, 교착 상태의 모든 멀리 갔다.

  4. ==============================

    4.의심이 높은 트래픽에 어떤 경험을했다 거라고 "전문가"이었다 ...

    의심이 높은 트래픽에 어떤 경험을했다 거라고 "전문가"이었다 ...

    웹 사이트는 보통 사람이 완전히로드 된 페이지를보고있는 시간에 의해 "더러운"입니다. 다음 데이터베이스에서로드하고 편집 한 것 데이터를 저장하는 형태를 고려? 그것은 사람들이 더러운 상관 없음 그러한되는 없습니다 읽지 않습니다에 대해 갈 길을 바보입니다.

    그것은 당신이 당신의 선택에 건물 층의 숫자가있는 경우, 당신은 위험한 중복에 건물이 될 수있다. 당신이 돈이나 상태 시나리오에있어 거래, 당신은 트랜잭션 데이터 / 쓰기,하지만 적절한 동시성 솔루션 읽을 필요가있는 경우 (뭔가 대부분의 "전문가"를 귀찮게하지 않는다).

    당신이 고급 제품 웹 사이트에 대한 검색이있는 경우 반면에, (즉, 뭔가를 가능성이 캐시 조금 집약적되지 않습니다) 당신은 이제까지 사이트를 구축 한 몇 가지 더 많은 동시 사용자보다 (phenominal 얼마나 많은 "전문가들은")하지 않은, 뒤에 목마다 다른 프로세스를 병에 rediculous이다.

    무슨 뜻인지 알고 적절한 때 그것을 사용할 수 있습니다. 데이터베이스는 거의 항상 주요 병목 요즘과 인프라 당신에게 수천을 저장할 수 있습니다 NOLOCK 사용에 대한 스마트되는 것입니다.

    편집 : 그것은 단지, 그것은에 도움이 교착 아니에요 당신이 당신이 완료, 또는 그 반대의 경우도 마찬가지 전까지 모두 다른 대기를 만들려고 얼마나 많은이기도합니다.

    EF4에 NOLOCK 힌트를 사용하십니까?

  5. ==============================

    5.답변의 아무도는 그러나 조금 어쩌면 혼란, 잘못 없다.

    답변의 아무도는 그러나 조금 어쩌면 혼란, 잘못 없다.

  6. ==============================

    6.전문 개발자로서 나는 그것을 따라 말하고 싶지만. 그러나 나는 확실히 GATS 및 OMG 조랑말 조언을 따르십시오. 그것이 도움이 때 알고, 당신은 무슨 일을하고 있는지 알고 있고 아파요 때

    전문 개발자로서 나는 그것을 따라 말하고 싶지만. 그러나 나는 확실히 GATS 및 OMG 조랑말 조언을 따르십시오. 그것이 도움이 때 알고, 당신은 무슨 일을하고 있는지 알고 있고 아파요 때

    힌트와 다른 가난한 아이디어를 읽고

    당신은 더 깊은 SQL 서버를 이해하고 무엇을 할 수 있습니다. 나는 일반적으로 SQL 힌트 악이라는 규칙을 따르지만, 내가 SQL 서버를 강제와 공급받을 때 불행하게도 나는 일을 지금 한 다음 모든를 사용 ...하지만 이러한 드문 경우입니다.

    루크

  7. ==============================

    7.앱 지원 (보고를 통해 음식을 장만되지 않은) SSMS를 사용하여 프로덕션 서버에서 응답 광고 호크 쿼리에 원하는 때 나는 그들이 NOLOCK을 사용 요청했다. '기본'사업은 영향을받지 않습니다 그런 식으로.

    앱 지원 (보고를 통해 음식을 장만되지 않은) SSMS를 사용하여 프로덕션 서버에서 응답 광고 호크 쿼리에 원하는 때 나는 그들이 NOLOCK을 사용 요청했다. '기본'사업은 영향을받지 않습니다 그런 식으로.

  8. ==============================

    8.나는 NOLOCK 힌트에 대한 그리고 특히 "적절 때 사용"라는 일부 의견에 동의합니다. 응용 프로그램이 잘못 작성된과 동시성 부적절한 방법을 사용하는 경우 - 즉, 잠금 에스컬레이션의 원인이 될 수 있습니다. 높은 트랜잭션 테이블은 또한 그들의 성격에 항상 잠겨지고있다. 데 좋은 인덱스 범위는 데이터를 검색하지만,하지 READ UNCOMMITTED에 격리 수준을 설정에 도움이되지 않습니다. 또한 나는 변화의 본질이 예측 될 때 NOLOCK 힌트를 사용하는 것은 많은 경우에 안전하다고 생각합니다. 예를 들어 - 여행자와 작업 측정의 삽입의 많은 다른 과정을 통해 갈 때 제조 안전하게 NOLOCK 힌트와 완성 된 작업 테이블에서 홍보 넣어 다른 세션 또는 배타적 잠금이 방법을 피하기 충돌에 대해 쿼리를 실행할 수 있습니다 /페이지. 이 경우에 액세스 데이터는 정적이지만, 기록 그리고 수천 업데이트 / 분당 삽입 수억 매우 트랜잭션 테이블에 상주 할 수 있습니다. 건배

    나는 NOLOCK 힌트에 대한 그리고 특히 "적절 때 사용"라는 일부 의견에 동의합니다. 응용 프로그램이 잘못 작성된과 동시성 부적절한 방법을 사용하는 경우 - 즉, 잠금 에스컬레이션의 원인이 될 수 있습니다. 높은 트랜잭션 테이블은 또한 그들의 성격에 항상 잠겨지고있다. 데 좋은 인덱스 범위는 데이터를 검색하지만,하지 READ UNCOMMITTED에 격리 수준을 설정에 도움이되지 않습니다. 또한 나는 변화의 본질이 예측 될 때 NOLOCK 힌트를 사용하는 것은 많은 경우에 안전하다고 생각합니다. 예를 들어 - 여행자와 작업 측정의 삽입의 많은 다른 과정을 통해 갈 때 제조 안전하게 NOLOCK 힌트와 완성 된 작업 테이블에서 홍보 넣어 다른 세션 또는 배타적 잠금이 방법을 피하기 충돌에 대해 쿼리를 실행할 수 있습니다 /페이지. 이 경우에 액세스 데이터는 정적이지만, 기록 그리고 수천 업데이트 / 분당 삽입 수억 매우 트랜잭션 테이블에 상주 할 수 있습니다. 건배

  9. ==============================

    9.나는 거의 결코 올바른 NOLOCK을 사용하는 것입니다 없다고 생각합니다.

    나는 거의 결코 올바른 NOLOCK을 사용하는 것입니다 없다고 생각합니다.

    개별 행 조치가 신속하게 완료 당신이 NOLOCK을 필요로하지 않습니다 단일 행을 읽고있는 경우, 올바른 인덱스 의미합니다.

    당신이 결과 수 반복 것에 대해 일시적으로 표시 이외의, 및 관리에 많은 행을 읽고 있다면, 또는 생산 번호로 방어하고 NOLOCK 적합하지 않습니다.

    NOLOCK는 "나는이 대답이 중복 삭제 된 행, 열, 또는 때문에 롤백의 시작에 삽입되지 않았다 행이 포함 된 경우 걱정하지 않는다"에 대한 대리 태그입니다

    NOLOCK에서 가능합니다 오류 :

    NOLOCK 이런 일이 발생할 수 있습니다 실행을 선택하는 동안 페이지 분할이 발생할 수있는 모든 작업입니다. 거의 (심지어 삭제) 조치는 페이지 분할이 발생할 수 있습니다.

    따라서 : 당신이 실행하는 동안 행이 변경되지 않습니다 것을 "알고있는"경우 인덱스가 효율적으로 검색을 허용하므로, NOLOCK 사용하지 마십시오.

    쿼리가 실행되는 동안 행을 변경할 수 있습니다 의심, 당신은 정확성에 대해 걱정하는 경우 NOLOCK 사용하지 마십시오.

    이 때문에 교착 상태의 NOLOCK을 고려하는 경우 교착 상태를 추적하고이 발생하는 이유를 참조 예상치 못한 테이블 스캔에 대한 쿼리 계획 구조를 검사합니다. 쓰기 주위 NOLOCK 이전에 모두 쓰기에게 잠재적으로 잘못된 대답을합니다 교착 상태가 쿼리를 의미 할 수있다.

  10. ==============================

    10.더 나은 솔루션은 가능한 경우는 다음과 같습니다

    더 나은 솔루션은 가능한 경우는 다음과 같습니다

    MS는 오라클에 판매를 잃고 있기 때문에 스냅 샷 트랜잭션 격리 수준을 만들었습니다. 오라클의 사용은이 문제를 방지하려면 / 리두 로그를 취소. 포스트 그레스 MVCC를 사용합니다. 앞으로 MS의 Heckaton는 MVCC를 사용하지만, 그 생산이 준비되는 것을 멀리 년이다.

  11. ==============================

    11.NOLOCK는 종종 데이터베이스 읽기 속도를 마법의 방법으로 이용된다,하지만 난 whever 수를 사용하지 않도록하려고합니다.

    NOLOCK는 종종 데이터베이스 읽기 속도를 마법의 방법으로 이용된다,하지만 난 whever 수를 사용하지 않도록하려고합니다.

    결과 세트는 종종 나중에 롤백 아직 커밋되지 않은 행을 포함 할 수 있습니다.

    오류 또는 결과 세트는 비어 누락 된 행 수 또는 같은 행에 여러 번 표시 할 수 있습니다.

    다른 트랜잭션이 당신이 그것을 읽고있는 동시에 데이터를 이동되기 때문입니다.

    READ COMMITTED 데이터가 여러 사용자가 동시에 동일한 셀을 변경 한 칼럼 내의 손상된 추가적인 문제점을 추가한다.

  12. ==============================

    12.이미 작성된 테이블에 인덱스를 추가 후 대폭 14gig 데이터 테이블의 데이터 로딩 속도가 느려 시스템을 발생하는 실제 생활에서 언젠가에 강제 보고서에 NOLOCK 등 총 funtions 그 (합계를 proessing 월말과 함께 사용 행, 페이지, 테이블 잠금을하고 전반적인 성능을 deteriate하지 않음) 등을 계산합니다. 쉬운 함께 NOLOCK 사용 인덱스를 사용하지 않을 새로운 시스템에 말을 -하지만 인덱스 어떤 severly 다운 그레이드 데이터 로딩을 추가하고 난 후 말했다있을 때, 잘, 삭제 인덱스에 코드베이스를 변경 한 후 대량로드는 인덱스를 재 -하는 당신이 새로운 시스템을 개발하는 경우 잘 좋은이다. 하지만 당신은 이미 그 자리에 시스템이없는 경우.

    이미 작성된 테이블에 인덱스를 추가 후 대폭 14gig 데이터 테이블의 데이터 로딩 속도가 느려 시스템을 발생하는 실제 생활에서 언젠가에 강제 보고서에 NOLOCK 등 총 funtions 그 (합계를 proessing 월말과 함께 사용 행, 페이지, 테이블 잠금을하고 전반적인 성능을 deteriate하지 않음) 등을 계산합니다. 쉬운 함께 NOLOCK 사용 인덱스를 사용하지 않을 새로운 시스템에 말을 -하지만 인덱스 어떤 severly 다운 그레이드 데이터 로딩을 추가하고 난 후 말했다있을 때, 잘, 삭제 인덱스에 코드베이스를 변경 한 후 대량로드는 인덱스를 재 -하는 당신이 새로운 시스템을 개발하는 경우 잘 좋은이다. 하지만 당신은 이미 그 자리에 시스템이없는 경우.

  13. from https://stackoverflow.com/questions/1452996/is-the-nolock-sql-server-hint-bad-practice by cc-by-sa and MIT license