-
문서화 되지 않은 %%lockres%% 컬럼SQL Server/Architecture 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 알고리즘이 수정되었습니다.(성이님 감사~^^)
더욱 자세한 정보를 알고 싶다면.. 아래 링크 참고하시기 바랍니다.
관련링크2: http://scarydba.com/2010/03/18/undocumented-virtual-column-lockres/
감사합니다.