예전에는 선배 개발자들이 SQL Server에서 쿼리할 때 WITH (NOLOCK)을 사용하는 걸 봤는데, 왜 그렇게 쓰는지 궁금했어요. 이제 이 기능을 탐색해보니 쿼리 실행 성능을 향상시키는 데 유용하다는 것을 알게 되었습니다. 하지만 사용에는 단점이 있습니다. 단점은 현재 테이블에서 업데이트되는 데이터를 받고 있는지 확신하지 못할 수 있다는 점입니다. 즉, 잠금 보호가 없으면 데이터가 제대로 업데이트되지 않는다는 보장이 불가능합니다 쿼리가 실행 중인 시간 동안 변경됩니다. 이 링크를 참고했는데 꽤 유용하다고 느꼈습니다.
일반적으로 SQL 쿼리 성능을 향상시키기 위해서는 인덱스를 생성하는 것이 첫 번째 고려사항입니다. 실제로 인덱스 설정 외에도, SQL 명령어를 입력할 때 문법에 WITH(NOLOCK) 섹션을 추가하면 온라인 쿼리가 많은 환경에서 데이터셋이 LOCK되는 현상을 개선하여 쿼리 성능을 향상시킬 수 있습니다.
하지만 한 가지 주의할 점은 SQL SELECT with (NOLOCK)가 더티 리드를 유발할 수 있다는 것입니다.
예를 들어:
SQL Server가 해당 잠금 일관성 검사를 수행하기 때문입니다. 전체 데이터베이스 쿼리 성능을 향상시키기 위해 SELECT 문법에서 테이블 이름 끝에 WITH (NOLOCK)을 추가하세요. (NOLOCK) 또한 허용되지만, Microsoft는 여전히 WITH를 추가할 것을 권장합니다.
간단한 SELECT 외에도 JOIN 문법과 함께 SELECT 문법을 사용할 수 있습니다. 하지만 DELETE, INSERT, UPDATE, 그리고 트랜잭션이 필요한 다른 명령어들은 좋지 않습니다...
일부 파일에서는 WITH(NOLOCK)로 SQL 쿼리 효율이 33% 증가할 수 있다고 합니다. WITH (NOLOCK)를 추가하면 SQL Server에 SELECT 명령어가 현재 테이블의 트랜잭션 락 상태를 고려할 필요가 없다는 것을 알게 되어, 성능이 크게 향상되고 데이터베이스 시스템의 락 현상(데드 락 포함)도 크게 줄어듭니다.
한 가지 주목할 점은 WITH (NOLOCK)가 현재 테이블의 트랜잭션 락을 고려하지 않기 때문에, 트랜잭션의 여러 단계(예: 여러 테이블에 걸친 트랜잭션 - > 인출 시스템)에 데이터가 있을 때 WITH(NOLOCK)는 현재 트랜잭션 프로세스를 처리하는 데이터를 무시한다는 것입니다...
솔직히 말해, NoLock을 사용할 때는 트랜잭션이 아직 완료되지 않은 수정된 데이터를 읽을 수 있습니다. 따라서 거래 데이터의 실시간 무결성을 고려해야 한다면 WITH(NOLOCK) 사용을 신중히 고려해야 합니다.
트랜잭션을 고려할 필요가 없다면, WITH (NOLOCK)가 유용한 참고 자료가 될 수 있습니다.
참고 1: WITH (< table_hint >) 쿼리 옵티마이저가 사용하는 하나 이상의 인덱스 테이블 스캔을 지정합니다. 또는 쿼리 옵티마이저가 이 데이터 테이블을 활용해 이 문장에 락 모드를 사용할 수도 있습니다.
참고 2: WITH (NOLOCK)는 READ UNCOMMITTED와 동등합니다
마지막으로, nolock과 with(nolock) 사이의 몇 가지 작은 차이점에 대해 이야기해 보겠습니다: 1: SQL05의 동의어는 (nolock)만 지원됩니다; 2: (nolock)는 매우 쉽게 작성되고 인덱스를 지정합니다. 서버 간 문장을 쿼리할 때는 (nolock)를 사용할 수 없고, nolock만 사용할 수 있습니다 같은 서버에서 쿼리할 때는 (nolock)와 nolock 둘 다 사용할 수 있습니다 예를 들면 SQL 코드 [IP].a.dbo.table1에서 *를 선택하세요. (nolock) 이 경우 *라는 오류가 표시됩니다. *를 a.dbo.table1에서 (nolock)로 선택하세요. 이 방법은 작동합니다. |