我寫了篇關于閂鎖和為什么SQL Server需要它們的文章。在今天的文章里,我想進一步談下非緩存區(qū)閂鎖(Non-Buffer Latches),還有在索引查找操作期間,SQL Server如何使用它們。在這里你會學到稱為閂鎖耦合(Latch Coupling)的概念。
索引查找操作(Index Seek Operations)
正如你知道的,SQL Server使用掃描(Scan)和查找(Seek)操作在索引(聚集和非聚集索引)里訪問數據。這里的查找操作使用B樹的導航結構在葉子節(jié)點查找特定的記錄。下圖展示了這個概念。
在這個例子里,SQL Server讀取索引根頁,在層級下的索引頁,最后在葉子級別讀取數據頁。每次SQL Server在緩存池里訪問這個頁,這個頁需要獲得共享閂鎖(Shared Latch)。共享閂鎖是至關重要的,因為在內存里,它讓當下處理的頁只讀:
- 每個排它閂鎖(Exclusive Latch)和共享閂鎖不兼容。
因此請求一個排它閂鎖會阻塞,SQL Server會提示你有個PAGELATCH_EX等待類型。
現在我們來看下在查找操作期間,在索引頁上,SQL Server如何獲取和釋放這些閂鎖。下列代碼展示了對于一個特定的會話ID,可以捕獲latch_acquired和latch_released事件的擴展事件會話(根據實際情況修改會話ID)。