Nieudokumentowana funkcja, nazywa się %%lockres%% i jest związana z implementacją blokowania SQL Server. Silnik bazy danych implementuje hierarchię blokowania i żąda blokad na poziomie tabeli, na poziomie strony i na poziomie rekordu.

Gdy wymagana jest blokada na poziomie rekordu, SQL Server nie umieszcza blokady na samym rekordzie — SQL Server po prostu generuje wartość skrótu (hash), a wynikowa wartość jest ostatecznie zablokowana. Aby obliczyć tę wartość skrótu, SQL Server używa nieudokumentowanej funkcji %% lockres%% .

Funkcję tę można również wywołać na poziomie instrukcji SELECT.

Po wywołaniu %%lockres%% w tabeli ze zdefiniowanym indeksem klastrowanym, funkcja ta zwraca wartość skrótu kolumny klucza klastrowanego. 

SELECT %%lockres%%, * FROM dbo.Foo

Wartość zwracana przez  funkcję jest bez znaczenia, ponieważ jest to tylko wartość skrótu. Jednak poznanie tej wartości jest bardzo przydatne, ponieważ w DMV sys.dm_tran_locks znajdziemy również tę wartość skrótu w kolumnie resource_description . Stąd można wyświetlić rekord, na którym zażądano konkretnej blokady.

select * from sys.dm_tran_locks 

Ponieważ nie zawsze mamy do czynienia z tabelą klastrowaną i chcemy dowiedzieć się o blokadach w stercie (Heap) gdzie nie nie ma wartości klucza, na podstawie której można wygenerować wartość skrótu, silnik blokuje blokuje wartość RID – tzw.  Row Identifier Value .

Ta wartość ma długość 8 bajtów i ma następujący format:

 FileID:PageID:Slot .

W momencie wywołania funkcji %%lockres%% na stercie, SQL Server zwróci wartość RID.

SELECT %%lockres%%, * FROM dbo.Foo_Heap

Posiadając te informacje łatwo jest określić, na którym pliku, stronie i slocie dany rekord jest przechowywany w tabeli sterty


Dariusz Brejnak

Od prawie trzydziestu lat jest pasjonatem informatyki, a zwłaszcza dziedzin dotyczących baz danych, hurtowni danych oraz ogólnie rozumianej tematyki BI. Jego druga pasja to fotografia http://dariuszbrejnak.pl