我寫(xiě)了篇關(guān)于閂鎖和為什么SQL Server需要它們的文章。在今天的文章里,我想進(jìn)一步談下非緩存區(qū)閂鎖(Non-Buffer Latches),還有在索引查找操作期間,SQL Server如何使用它們。在這里你會(huì)學(xué)到稱為閂鎖耦合(Latch Coupling)的概念。

索引查找操作(Index Seek Operations)

正如你知道的,SQL Server使用掃描(Scan)和查找(Seek)操作在索引(聚集和非聚集索引)里訪問(wèn)數(shù)據(jù)。這里的查找操作使用B樹(shù)的導(dǎo)航結(jié)構(gòu)在葉子節(jié)點(diǎn)查找特定的記錄。下圖展示了這個(gè)概念。

在這個(gè)例子里,SQL Server讀取索引根頁(yè),在層級(jí)下的索引頁(yè),最后在葉子級(jí)別讀取數(shù)據(jù)頁(yè)。每次SQL Server在緩存池里訪問(wèn)這個(gè)頁(yè),這個(gè)頁(yè)需要獲得共享閂鎖(Shared Latch)。共享閂鎖是至關(guān)重要的,因?yàn)樵趦?nèi)存里,它讓當(dāng)下處理的頁(yè)只讀:

  • 每個(gè)排它閂鎖(Exclusive Latch)和共享閂鎖不兼容。

因此請(qǐng)求一個(gè)排它閂鎖會(huì)阻塞,SQL Server會(huì)提示你有個(gè)PAGELATCH_EX等待類型。

現(xiàn)在我們來(lái)看下在查找操作期間,在索引頁(yè)上,SQL Server如何獲取和釋放這些閂鎖。下列代碼展示了對(duì)于一個(gè)特定的會(huì)話ID,可以捕獲latch_acquired和latch_released事件的擴(kuò)展事件會(huì)話(根據(jù)實(shí)際情況修改會(huì)話ID)。

網(wǎng)友評(píng)論