[sql] SELECT 문에서 NOLOCK 힌트의 영향

실제 질문은 다음과 같습니다.

더티 읽기에 신경 쓰지 않으면 with (NOLOCK) 힌트를 SELECT 문에 추가하면 성능에 영향을 미칩니다.

  1. 현재 SELECT 문
  2. 주어진 테이블에 대한 다른 거래

예:

Select *
from aTable with (NOLOCK)



답변

1) 하는로 선택 NOLOCK빠르게 정상을 선택보다는 완료됩니다.

2) . with with NOLOCK를 선택 하면 영향을받는 테이블에 대한 다른 쿼리가 일반 선택보다 빠르게 완료됩니다.

왜 이럴까요?

NOLOCK일반적으로 (DB 엔진에 따라 다름)은 데이터를 제공한다는 것을 의미하며 데이터의 상태를 신경 쓰지 않으며 읽을 때 여전히 데이터를 유지하지 않아도됩니다. 한 번에 더 빠르며 리소스를 많이 사용하지 않으며 매우 위험합니다.

시스템에서 중요하거나 시스템에서 중요한 작업을 수행하거나 NOLOCK읽기 에서 시작된 데이터를 사용하여 절대적인 정확성이 요구되는 곳에서는 절대로 업데이트하지 마십시오 . 이 데이터에는 쿼리 실행 중 삭제되었거나 아직 완료되지 않은 다른 세션에서 삭제 된 행이 포함되어있을 수 있습니다. 이 데이터에 부분적으로 업데이트 된 행이 포함되어있을 수 있습니다. 이 데이터에는 외래 키 제약 조건을 위반하는 레코드가 포함되어있을 수 있습니다. 이 데이터는 테이블에 추가되었지만 아직 커밋되지 않은 행을 제외 할 수 있습니다.

실제로 데이터 상태를 알 수있는 방법이 없습니다.

약간의 오차가 허용되는 행 수 또는 기타 요약 데이터와 같은 것을 얻으려는 경우 NOLOCK이러한 쿼리의 성능을 향상시키고 데이터베이스 성능에 부정적인 영향을 미치지 않는 좋은 방법입니다.

항상 NOLOCK힌트를주의해서 사용하고 의심되는 데이터는 모두 처리하십시오.


답변

NOLOCK은 공유 잠금이 없기 때문에 대부분의 SELECT 문을 더 빠르게 만듭니다. 또한 잠금 발행이 없으면 SELECT가 작성자를 방해하지 않습니다.

NOLOCK은 기능적으로 READ UNCOMMITTED의 격리 수준과 같습니다. 주요 차이점은 원하는 경우 일부 테이블에는 NOLOCK을 사용할 수 있지만 다른 테이블에는 사용할 수 없다는 것입니다. 복잡한 쿼리의 모든 테이블에 대해 NOLOCK을 사용하려는 경우 모든 테이블에 힌트를 적용 할 필요가 없기 때문에 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED를 사용하는 것이 더 쉽습니다.

다음은 사용 가능한 모든 격리 수준과 테이블 힌트에 대한 정보입니다.

트랜잭션 격리 수준 설정

테이블 힌트 (Transact-SQL)


답변

위에서 말한 것 외에도 nolock은 실제로 선택 하기 전에 커밋 된 행을 얻지 못할 위험이 있음을 알고 있어야합니다 .

http://blogs.msdn.com/sqlcat/archive/2007/02/01/previously-committed-rows-might-be-missed-if-nolock-hint-is-used.aspx 참조


답변

잠금을 기다릴 필요가 없으므로 더 빠릅니다.


답변

  • 각 트랜잭션이 다른 트랜잭션이 완료 될 때까지 기다릴 필요가 없기 때문에 쿼리가 한 번에 여러 번 실행되는 경우 대답은 입니다. 그러나 쿼리가 자체적으로 한 번 실행되면 대답은 아니오입니다.

  • . WITH (NOLOCK)을주의해서 사용하면 데이터베이스 속도가 크게 향상 될 가능성이 큽니다. 즉, 다른 트랜잭션은이 SELECT 문이 완료 될 때까지 기다릴 필요가 없지만 다른 트랜잭션은 처리 시간을 새 트랜잭션과 공유하므로 속도가 느려집니다.

클러스터형 인덱스가있는 테이블의 SELECT 문 에서만 사용하도록 주의하십시오 WITH (NOLOCK).

WITH (NOLOCK)은 종종 데이터베이스 읽기 트랜잭션 속도를 높이는 마법의 방법으로 악용됩니다.

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

비 클러스터형 인덱스가있는 테이블에 WITH (NOLOCK)을 적용하면 행 데이터가 결과 테이블로 스트리밍 될 때 다른 트랜잭션에서 행 인덱스를 변경할 수 있습니다. 이는 결과 집합에 행이 누락되거나 동일한 행이 여러 번 표시 될 수 있음을 의미합니다.

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


답변