1. (NOLOCK)
SELECT 쿼리에서 테이블 공유 잠금을 피하고 다른 트랜잭션이 테이블을 업데이트하는 동안에도 읽을 수 있도록 하는 힌트. "읽기 잠금" 을 건너뛰므로 성능 향상 효과가 있다.
① NOLOCK 사용
: 쿼리 실행시간이 긴 SELECT 쿼리 실행 중에도 다른사용자가 테이블에 INSERT, UPDATE, DELETE 가능
SELECT A.ORDERID
, A.ORDERDATE
, B.CUSTOMERNAME
, C.PRODUCTNAME
, C.QUANTITY
FROM ORDERS A (NOLOCK)
JOIN CUSTOMERS B (NOLOCK) ON A.CUSTOMERID = B.CUSTOMERID
JOIN ORDERDETAILS C (NOLOCK) ON A.ORDERID = C.ORDERID
WHERE 1=1
AND A.ORDERDATE > '2024-01-01';
② NOLOCK 미사용
: 쿼리 실행시간이 긴 SELECT 쿼리 실행이 끝나기 전까지 다른 사용자는 INSERT, UPDATE, DELETE 불가
SELECT A.ORDERID
, A.ORDERDATE
, B.CUSTOMERNAME
, C.PRODUCTNAME
, C.QUANTITY
FROM ORDERS A
JOIN CUSTOMERS B ON A.CUSTOMERID = B.CUSTOMERID
JOIN ORDERDETAILS C ON A.ORDERID = C.ORDERID
WHERE 1=1
AND A.ORDERDATE > '2024-01-01';
2. 장점
- 데이터베이스에서 동시성 제어를 위해 사용한다. 성능 이슈가 있거나 동시성 제어가 중요한 시스템에서 NOLOCK 을 사용해 데이터 일관성에 대한 리스크를 감수하고, 데이터를 더 빠르게 읽는다.
- NOLOCK 힌트를 사용하면 공유 잠금을 걸지 않기 때문에 SELECT가 실행되는 동안에도 다른 트랜잭션에서 INSERT, UPDATE, DELETE 등의 쓰기 작업이 가능하다.
3. 단점
(NOLOCK)을 사용하면 테이블의 데이터를 더 빠르게 조회할 수 있고, 동시성이 향상되지만, 읽어들이는 데이터의 일관성이 떨어질 수 있다. 성능이 중요한 시스템에서 사용할 수 있지만, 데이터 일관성이 중요한 시스템에서는 사용에 주의해야 한다.
① Dirty Read: 아직 커밋되지 않은 데이터를 읽어서 부정확한 정보를 조회할 가능성이 있다.
② Non-repeatable Read: 읽는 중에 데이터가 변경되어 동일한 쿼리를 반복해서 실행할 때 결과가 달라질 수 있다.
③ Phantom Read: 읽는 중에 레코드가 추가, 삭제되어 결과에 영향을 줄 수 있다.
4. 기타
시스템을 유지보수하는 경우, 운영 DB에 직접 접근하여 업무 처리를 하는 경우가 많다. 이때 실행시간이 긴 쿼리를 SELECT 하면 업무 시스템 성능에 직접적으로 영향을 줄 수 있기 때문에 업무 중에는 무조건 NOLOCK 힌트를 붙여야 한다. (라고 선배한테 배웠다.) SM 담당자는 무조건 NOLOCK을 쓰는 것을 습관화해야 한다 !!! ⭐⭐⭐⭐⭐