在今天的文章里,我想向你展示下SQL Server里一個(gè)未公開(kāi)的函數(shù),還有你如何用那個(gè)函數(shù)來(lái)找出在哪頁(yè)記錄被存儲(chǔ)。
%%lockres%%今天我想向你展示的未公開(kāi)函數(shù)叫做%%lockres%%,它與SQL Server的鎖實(shí)現(xiàn)有關(guān)。我們都知道,SQL Server實(shí)現(xiàn)鎖層級(jí)并在記錄層,頁(yè)層,表層請(qǐng)求鎖。當(dāng)在記錄層鎖被請(qǐng)求,SQL Server不在記錄本身放置鎖——SQL Server生成一個(gè)哈希值(hash value),這個(gè)結(jié)果哈希值最后被鎖。為了計(jì)算這個(gè)哈希值,SQL Server使用未公開(kāi)的%%lockres%%函數(shù)——你也可以自己調(diào)用。
當(dāng)你在聚集表(有聚集索引定義的表)上調(diào)用這個(gè)函數(shù),%%lockres%%返回你聚集鍵列的哈希值。
1 SELECT %%lockres%%, * FROM Person.Person
通過(guò)%%lockres%%的返回值幾乎沒(méi)有意思,因?yàn)樗皇莻€(gè)哈希值。但它可以是很方便的,因?yàn)樵?strong>sys.dm_tran_locks DMV里,你會(huì)知道resource_description列的哈希值。因?yàn)楹苋菀渍页鲈谀菞l記錄上鎖被請(qǐng)求。
當(dāng)你想在堆表上請(qǐng)求一個(gè)行層的鎖,沒(méi)有鍵值可以生成哈希值。在這個(gè)情況下,SQL Server在RID值上放置鎖——即所謂的行標(biāo)識(shí)值(Row Identifier Value)。這個(gè)值8 bytes長(zhǎng)有如下格式:文件號(hào):頁(yè)號(hào):槽號(hào)(FileID:PageID:Slot)。當(dāng)你在堆表上調(diào)用%%lockres%%時(shí),SQL Server會(huì)返回你這個(gè)RID值。
1 SELECT %%lockres%%, * FROM DatabaseLog
因此很容易在堆表上找到在哪個(gè)文件,哪個(gè)頁(yè),哪個(gè)槽號(hào)記錄被存儲(chǔ)——很簡(jiǎn)單,是不是?
感謝關(guān)注!
新聞熱點(diǎn)
疑難解答
圖片精選