Programming

SQL Server NOLOCK 및 조인

procodes 2020. 6. 21. 21:06
반응형

SQL Server NOLOCK 및 조인


배경 : 실행하려는 성능에 중요한 쿼리가 있으며 더티 읽기에 대해서는 신경 쓰지 않습니다.

내 질문은; 조인을 사용하는 경우 NOLOCK 힌트도 지정해야합니까?

예를 들어; 입니다 :

SELECT * FROM table1 a WITH (NOLOCK)
INNER JOIN table2 b WITH (NOLOCK) ON a.ID = b.ID

다음과 같습니다.

SELECT * FROM table1 a WITH (NOLOCK)
INNER JOIN table2 b ON a.ID = b.ID

또는 (NOLOCK)조인 된 테이블을 잠그지 않도록 조인에 힌트 를 지정해야 합니까?


나는 READ UNCOMMITTED논증 을 다루지 않을 것이며 , 당신의 원래 질문 만 할 것입니다.

예, WITH(NOLOCK)각 조인 테이블에 필요 합니다. 아니요, 검색어가 동일하지 않습니다.

이 운동을 시도하십시오. 트랜잭션을 시작하고 table1 및 table2에 행을 삽입하십시오. 아직 트랜잭션을 커밋하거나 롤백하지 마십시오. 이 시점에서 첫 번째 쿼리가 성공적으로 반환되고 커밋되지 않은 행이 포함됩니다. table2에 WITH(NOLOCK)힌트 가 없으므로 두 번째 쿼리가 반환되지 않습니다 .


쿼리에서 NOLOCK각각 을 지정해야한다고 확신했습니다 JOIN. 그러나 내 경험은 SQL Server 2005로 제한되었습니다.

확인하기 위해 MSDN을 조회했을 때 명확한 것을 찾을 수 없었습니다. 아래 진술은 2008 년의 경우 위의 두 진술이 2005 년이지만 동일하지만 그렇지 않다고 생각합니다.

[SQL Server 2008 R2]

모든 잠금 힌트는 뷰에서 참조되는 테이블 및 뷰를 포함 하여 쿼리 계획에 의해 액세스되는 모든 테이블 및 뷰에 전파됩니다 . 또한 SQL Server는 해당 잠금 일관성 검사를 수행합니다.

[SQL Server 2005]

SQL Server 2005에서는 모든 잠금 힌트가 뷰에서 참조되는 모든 테이블과 뷰에 전파됩니다. 또한 SQL Server는 해당 잠금 일관성 검사를 수행합니다.

또한 참고 사항-이는 2005 년과 2008 년 모두에 적용됩니다.

쿼리 계획에서 테이블에 액세스하지 않으면 테이블 힌트가 무시됩니다. 옵티마이 저가 테이블에 전혀 액세스하지 않기로 선택했거나 인덱싱 된 뷰가 대신 액세스 되었기 때문일 수 있습니다. 후자의 경우 OPTION (EXPAND VIEWS)쿼리 힌트 를 사용하여 인덱싱 된 뷰에 액세스하지 못하게 할 수 있습니다 .


둘 다. READ UNCOMMITTED개별 잠금 힌트를 제공하는 것보다 항상 격리 수준을 낫게 설정합니다 . 또는 일관성 과 같은 세부 사항에 관심이있는 경우 스냅 샷 격리를 사용하는 것이 좋습니다 .

참고 URL : https://stackoverflow.com/questions/3783525/sql-server-nolock-and-joins

반응형