2011. 10. 9.

mssql nolock에 대하여

Select 를 할 때 SQL서버는 Select 를 하는 그 순간에만 공유 잠금(Shared Lock)을 건다. 그런데 이 공유 잠금은 Insert, Update, Delete 가 수행될 때 걸리는 베타적 자금(Exclusive Lock)과 함께 걸릴 수는 없다.
따라서 Select 를 하는 동안에는 공유 자금이 걸린 곳에 대해 Insert, Update, Delete가 발생할 수 없기 때문에 질의 결과를 지연시키고 웹 언어(asp.net, asp)의 성능 저하를 가지고 오게 된다.
(noLock) 힌트를 사용하면 Select 를 하는 동안 선택된 레코드가 그 순간에 다른 Sql문에 변경될 수 있다.(이런 경우를 막기 위해 공유 잠금을 거는 것이다.) 그러나 대부분의 Select 경유 정확한 값이 아니어도 상관이 없는 경우가 대 부분이라 할 수 있다.
예를 들어 게시판의 경우가 Select하는 동안에 글의 조회수가 올라 간다던가 혹여 다른 글이 올라 왔다고 하드라두 크게 문제가 되지 않기 때문이다. 그러나 쓰지 말아야 할 경우라고 한다면 중요하게 실시간으로 결재내역을 본다던가 아니면 입.출금 변동사항을 본다던가  할 때에는 쓰지 말아야 할 것이다.
Select title, contents, id, From board (nolock) 

댓글 없음:

댓글 쓰기