Dev/Database

[MSSQL] MSSQL 쿼리문에서 NOLOCK 사용해야하는 이유

알굼 2024. 10. 2. 14:07
반응형

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을 쓰는 것을 습관화해야 한다 !!! ⭐⭐⭐⭐⭐

반응형