본문 바로가기

db

READPAST 그리고 WITH(NOLOCK)


READPAST와 WITH(NOLOCK)의 차이를 확인 해보자.

테이블 : Table1
컬럼명 : C1, C2
데이터는 아래와 같다.
------------------------------------------
 ROW   |     C1        |     C2
------------------------------------------
   1      |      0         |       1
------------------------------------------
   2      |      0         |       2

Table1의 컬럼명 C2에서 데이터값이 ROW 1 대하여 C1컬럼의 데이터 "0"을 주기적(1초) 20초 동안 업데이트 하는 쿼리를 만들어보면 아래와 같다.

DECLARE @I INT, @MAXNO INT
SET 
@I=1
SET @MAXNO=20

BEGIN TRANSACTION

WHILE @I<=@MAXNO
BEGIN
    UPDATE Table1 SET C1 = STR(@I) WHERE C2 = 1
    SET @I=@I+1
    WAITFOR DELAY '00:00:01' 
END
COMMIT


위 쿼리가 실행되는 동안 아래 세가지 쿼리를 실행해보자.

SELECT * FROM Table1 
20초동안 실행결과는 아무것도 나오지 않고 대기상태에 있다.

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED(WITH(NOLOCK)과 같다.)
SELECT * FROM
Table1 
ROW1은 20초 동안 LOCK인 상태이나 LOCK을 무시하고 가져옵니다. ROW1값의 C1컬럼 값이 20초 동안 주기적으로 변화하는 것을 확인 하실 수 있다.

SET TRANSACTION ISOLATION LEVEL READ COMMITTED
SELECT * FROM
Table1 WITH(READPAST)
ROW1은 20초 동안 LOCK인 상태로 ROW2만 가져온다. LOCK이 걸린 ROW는 무시하고 LOCK걸리지 않는 ROW만 가져오라는 것 이다.

READPAST를 이용하는게 WITH(NOLOCK)을 이용하는 것보다 성능상 유리하다는 지금은 찾지 못하고 있는... 해외 사이트를 본적이 있다.

결론은... 주기적으로 INSERT UPDATE가 이루어지는 최신 데이터를 가져오는 곳이 아닌.. 과거 매출이나 과거 주문정보와 같은 곳에 READPAST를 사용하면... 더 좋지 않을까...@.@;
 

※ DB Lock확인 쿼리
  select * from master.dbo.sysprocesses
  where blocked != 0 and spid != blocked

'db' 카테고리의 다른 글

DB 파티셔닝  (0) 2011.03.07
SQL Injection Blocking  (0) 2009.05.27
커서(CURSOR)를 TABLE변수로 변경  (1) 2008.12.29