SELECT 문에서 NOLOCK 힌트의 영향
실제 질문은 다음과 같습니다.
더티 읽기에 신경 쓰지 않으면 with (NOLOCK) 힌트를 SELECT 문에 추가하면 성능에 영향을 미칩니다.
- 현재 SELECT 문
- 주어진 테이블에 대한 다른 거래
예:
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를 사용하는 것이 더 쉽습니다.
다음은 사용 가능한 모든 격리 수준과 테이블 힌트에 대한 정보입니다.
위에서 말한 것 외에도 nolock은 실제로 선택 하기 전에 커밋 된 행을 얻지 못할 위험이 있음을 알고 있어야합니다 .
http://blogs.msdn.com/sqlcat/archive/2007/02/01/previously-committed-rows-might-be-missed-if-nolock-hint-is-used.aspx 참조
잠금을 기다릴 필요가 없으므로 더 빠릅니다.
기다릴 필요가 없으므로 현재 SELECT가 더 일찍 시작됩니다.
다른 트랜잭션은 처리 시간을 새 트랜잭션과 공유하므로 속도가 느려집니다.
사용하지 마십시오.
NOLOCK은 종종 데이터베이스 읽기 속도를 높이는 마법의 방법으로 악용되지만 가능하면 사용하지 않는 것이 좋습니다.
결과 세트에는 아직 커미트되지 않은 행이 포함되어있을 수 있으며이 행은 종종 나중에 롤백됩니다.
오류 또는 결과 세트는 비어 있거나 행이 누락되었거나 동일한 행을 여러 번 표시 할 수 있습니다.
다른 트랜잭션이 데이터를 읽는 동시에 데이터를 이동하기 때문입니다.
READ COMMITTED는 여러 사용자가 동일한 셀을 동시에 변경하는 단일 열 내에서 데이터가 손상되는 추가 문제를 추가합니다.
다른 부작용도 있기 때문에 처음에 얻고 자하는 속도 증가를 희생시킵니다.
이제 다시는 사용하지 마십시오.
참고 URL : https://stackoverflow.com/questions/210171/effect-of-nolock-hint-in-select-statements
'Programming' 카테고리의 다른 글
| 소스 트리-푸시되지 않은 커밋 실행 취소 (0) | 2020.05.12 |
|---|---|
| F- 문자열로 소수점 이하의 고정 숫자 (0) | 2020.05.12 |
| git은 공백과 탭을 자동으로 전환 할 수 있습니까? (0) | 2020.05.12 |
| MySQL 인덱스-모범 사례는 무엇입니까? (0) | 2020.05.12 |
| C ++ 11 범위 기반 루프 : 값으로 항목 가져 오기 또는 const 참조 (0) | 2020.05.12 |