2016-09-21 4 views
0

하나는이 문을 나에게 와서 잠금 선택 :행과 테이블의 80 %가 동료의

컬럼에 WHERE 절을하면서 행의 80 %를 가져 오기 테이블에 SELECT를 갖는 색인으로 따라서이를 피하려면 FROM 절에 WITH (NOLOCK)을 추가하십시오.

그의 유일한 인수는 다음과 같습니다. 나를 직접 경험했습니다. 이에 대한 적절한 문서를 찾을 수 없습니다.

내가 아는 한 WITH (NOLOCK)UPDATEINSERT을 선택하는 동안 테이블에 영향을주고 더러운 읽기를 유도 할 수 있습니다.

제 동료의 가정이 맞습니까?

+1

[SQL Server의 가능한 복제본 - "with (nolock)"을 사용해야하는 경우] (http://stackoverflow.com/questions/686724/sql-server-when-should-you-use-with-nolock) – Igor

+2

허용 된 대답을 가능한 복제본으로 읽는 경우에만 매우 신중해야합니다. NOLOCK은 단순히 더티 읽기보다 더 사악해질 수 있습니다. 언젠가 전체 데이터 페이지를 놓칠 수 있습니다. 또는 여러 번 페이지를 읽을 수 있습니다. 이 기사에서는 NOLOCK에서 발생할 수있는 여러 가지 나쁜 점에 대해 다룹니다. http://blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere/ 좀 더 깊이있는 기사를 읽으려면 오해의 여지가있는 쿼리 힌트에 대해 깊이 들어가야합니다. –

+0

다음은 SQL Server 동시성에 대한 몇 가지 정보를 제공하는 [무료 PDF] (http://www.sqlservercentral.com/articles/books/93946/)입니다. – BJones

답변

0

난 당신이 잠금을 에스컬레이션, https://technet.microsoft.com/en-us/library/ms184286(v=sql.105).aspx, 나쁜 선택과 색인 및 블로킹에 대한 몇 가지 가능성에 의한 테이블 스캔과 함께 생각하는 것 같아요.

클러스터되지 않은 색인에 대한 통계는 특정 값에 대해 테이블에서 리턴 된 행 수가 임계 값을 초과 함을 보여 주면, 옵티마이 저는 인덱스 스캔 대신 대응하는 행을 찾기 위해 테이블 ​​스캔을 사용하도록 선택합니다 수량이 느리기 때문에 해당 북마크 조회가 필요합니다.

나는 일반적으로 사람들에게 그 비율을 5 % 이하로 원하지만, 때로는 여전히 10 % 정도까지 색인을 찾습니다. 80 %에서 확실히 테이블 스캔으로 이동합니다.

또한 쿼리가 테이블 스캔을 수행 중이므로 쿼리는 테이블의 모든 단일 행에서 일종의 잠금을 획득 할 수 있어야합니다. 업데이트 수행을 실행하는 다른 쿼리가 있거나 단일 행에서도 잠금을 얻지 못하는 경우 쿼리를 기다려야합니다.

잠금 에스컬레이션의 경우 백분율은 아니지만 특정 마법 번호는 5,000입니다. 일반적으로 쿼리는 행 잠금을 사용하여 행 읽기를 시작합니다. 단일 쿼리가 5,000 개 이상의 행을 읽으면 행 및/또는 페이지 잠금에서 전체 테이블 잠금까지 테이블에 대해 사용중인 잠금을 확대합니다.

다른 쿼리가 동일한 작업을 수행하려고 시도 할 수 있기 때문에 교착 상태가 발생하는 경우입니다.

이러한 잠금은 삽입/업데이트와 관련이 없습니다.

이것은 실제 것입니다. 아니오, NOLOCK을 사용해야한다는 의미는 아닙니다. 교착 상태에 문제가있는 경우 READPAST, TABLOCK 또는 TABLOCKX, https://msdn.microsoft.com/en-us/library/ms187373.aspx을 보는 것이 훨씬 좋습니다.

그냥 습관적으로 벗어나지 말고 실제로 문제가있는 트랜잭션 테이블이 많은 특정 인스턴스를 조사하십시오.

0

기본적으로 작성자는 우선 순위가 있으며 독자는 작성자가 완료 될 때까지 기다립니다. WITH (NOLOCK)을 사용하면 독자가 커밋되지 않은 데이터를 읽을 수 있으므로 작성자의 대기를 피할 수 있습니다. 매우 큰 테이블에 대한 읽기 전용 쿼리의 경우 데이터의 이전 파티션과 같은 데이터를 쿼리하거나 자주 변경하지 않을 데이터를 가져오고 데이터 프레젠테이션에서 변경 사항이 중요하지 않은 경우이 작업은 정상입니다.SP의 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 지시문을 사용하는 것과 같습니다.

관련 문제