DB 및 개발/SQL Server - Architecture

문서화 되지 않은 %%lockres%% 컬럼

Eastluck 2011. 4. 21. 18:42

안녕하세요. 비전팀 1기 강동운입니다.


이번에는 문서화되지 않은 %%lockres%% 컬럼에 대해 소개해드리겠습니다.


이 컬럼은 Lock 과 Deadlock을 조사하는데 사용됩니다.


이 값은 테이블에 Clustered Index 존재의 여부에 따라서 두가지 형태로 존재할 수 있습니다.


1. RID 형태(Clustered Index가 존재하지 않는 경우)

2. Hash 값(Clustered Index가 존재하는 경우)




예제를 통해서 살펴보도록 하겠습니다.


IF OBJECT_ID('TblTest','U') IS NOT NULL

       DROP TABLE TblTest

GO

 

CREATE TABLE TblTest

(

       IDX          INT    IDENTITY(1,1) NOT NULL

,      DATA   CHAR(500)

)

GO

--//3건삽입

INSERT INTO TblTest(DATA) SELECT 'A'

INSERT INTO TblTest(DATA) SELECT 'A'

INSERT INTO TblTest(DATA) SELECT 'A'

GO

 

SELECT %%lockres%%, * FROM TblTest

GO


 

테이블에 클러스터드 인덱스가 없기 때문에 RID 형태로 출력이 되었습니다.

이런 경우 아래 같은 경우로 검색을 할 수 있습니다.


SELECT %%lockres%%, * FROM TblTest WHERE %%lockres%% = '1:305:0'

 


이제 클러스터드 인덱스를 만들어보도록 하겠습니다.


CREATE CLUSTERED INDEX CL_TblTest_IDX ON TblTest(IDX)

GO

SELECT %%lockres%%, * FROM TblTest

GO

 


클러스터드 인덱스를 생성했더니 이상한 6 bytes 값으로 변경되었습니다.

이 값은 Clustered Index의 값을 SQL Server Hash Function으로 돌렸을 때 나오는 Hash 값입니다.


이것 또한 아래 같은 형태로 조회가 가능합니다.

SELECT %%lockres%%, * FROM TblTest WHERE %%lockres%% = '(0200c411ba73)'


 



SQL Server 2008 R2 부터는 Hash 알고리즘이 수정되었습니다.(성이님 감사~^^)


http://blogs.msdn.com/b/sqlserverstorageengine/archive/2010/01/18/improvement-in-minimizing-lockhash-key-collisions-in-sql-server-2008r2-and-its-impact-on-concurrency.aspx


더욱 자세한 정보를 알고 싶다면.. 아래 링크 참고하시기 바랍니다.


관련링크1: http://www.sqlskills.com/BLOGS/PAUL/post/Investigating-locking-and-deadlocking-with-2525lockres2525.aspx

관련링크2: http://scarydba.com/2010/03/18/undocumented-virtual-column-lockres/


감사합니다.