czwartek, 30 grudnia 2010

%%lockres%%

Następną ciekawą funkcją dostępną w SQL Server 2005 i 2008 jest %%lockres%%
Pokazuje nam ona w pseudokolumnie klucz każdego rekordu (KeyHashValue)

SELECT %%lockres%%,* FROM test
-------------
                   id          tekst     dtekst               data
------------------ ----------- ----------------------------------------------------
(8194443284a0)     1           abc       ABCqazwsx0987qa<..>  2010-12-30 13:41:44.673
(61a06abd401c)     2           abc       ABCqazwsx0987qa<..>  2010-12-30 13:44:31.423

To ten magiczny znacznik widzimy w widoku sys.dm_tran_locks w polu resource_description dla typu key, to nim serwer posługuje się przy obsłudze lokowań

W innej sesji odpalamy

BEGIN TRAN
UPDATE test
SET tekst ='abcd'
WHERE id =1

I sprawdzamy
select * from sys.dm_tran_locks                     



Dzięki takiemu mechanizmowi możemy sprawdzać jakie wiersze są w zablokowane

SELECT a.* FROM test  AS a with (NOLOCK)
JOIN sys.dm_tran_locks AS l
ON a.%%lockres%% = l.resource_description
WHERE l.resource_type = 'KEY'     

-------------
id          tekst     dtekst               data
------------ ----------------------------------------------------
1           abc       ABCqazwsx0987qa<..>  2010-12-30 13:41:44.673


Wartość ta jest przechowywana na poziomie strony

DBCC PAGE (5, 1,20636,3) WITH TABLERESULTS, NO_INFOMSGS



Klucz jest generowany losowo i w tabeli o bardzo dużej ilości danych może się zdarzyc, że klucze się powtórzą, dochodzi wówczas do zablokowania rekordów zupełnie ze sobą niezwiązanych

select %%lockres%% FROM CalkiemSporaTabela --100 mln rekordow
group by %%lockres%%
having count(%%lockres%%)>1

------------
(06006b69f9b0)
.....
.....

(1485 row(s) affected)

Brak komentarzy:

Prześlij komentarz