天天看點

堆表和%%lockres%%函數

在今天的文章裡,我想向你展示下SQL Server裡一個未公開的函數,還有你如何用那個函數來找出在哪頁記錄被存儲。

%%lockres%%

今天我想向你展示的未公開函數叫做%%lockres%%,它與SQL Server的鎖實作有關。我們都知道,SQL Server實作鎖層級并在記錄層,頁層,表層請求鎖。當在記錄層鎖被請求,SQL Server不在記錄本身放置鎖——SQL Server生成一個哈希值(hash value),這個結果哈希值最後被鎖。為了計算這個哈希值,SQL Server使用未公開的%%lockres%%函數——你也可以自己調用。

當你在聚集表(有聚集索引定義的表)上調用這個函數,%%lockres%%傳回你聚集鍵列的哈希值。

1 SELECT %%lockres%%, * FROM Person.Person      

通過%%lockres%%的傳回值幾乎沒有意思,因為它隻是個哈希值。但它可以是很友善的,因為在sys.dm_tran_locks DMV裡,你會知道resource_description列的哈希值。因為很容易找出在那條記錄上鎖被請求。

當你想在堆表上請求一個行層的鎖,沒有鍵值可以生成哈希值。在這個情況下,SQL Server在RID值上放置鎖——即所謂的行辨別值(Row Identifier Value)。這個值8 bytes長有如下格式:檔案号:頁号:槽号(FileID:PageID:Slot)。當你在堆表上調用%%lockres%%時,SQL Server會傳回你這個RID值。

1 SELECT %%lockres%%, * FROM DatabaseLog      
堆表和%%lockres%%函數

是以很容易在堆表上找到在哪個檔案,哪個頁,哪個槽号記錄被存儲——很簡單,是不是?

感謝關注!

參考文章:

https://www.sqlpassion.at/archive/2015/06/22/heap-tables-and-lockres/

注:此文章為

WoodyTu

學習MS SQL技術,收集整理相關文檔撰寫,歡迎轉載,請在文章頁面明顯位置給出此文連結!

若您覺得這篇文章還不錯請點選下右下角的推薦,有了您的支援才能激發作者更大的寫作熱情,非常感謝!