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

索引查找操作(Index Seek Operations)

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

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

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

因此請求一個排它閂鎖會阻塞,SQL Server會提示你有個PAGELATCH_EX等待類型。

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