我寫了篇關(guān)于閂鎖和為什么SQL Server需要它們的文章。在今天的文章里,我想進(jìn)一步談下非緩存區(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é)點(diǎn)查找特定的記錄。下圖展示了這個(gè)概念。
在這個(gè)例子里,SQL Server讀取索引根頁,在層級下的索引頁,最后在葉子級別讀取數(shù)據(jù)頁。每次SQL Server在緩存池里訪問這個(gè)頁,這個(gè)頁需要獲得共享閂鎖(Shared Latch)。共享閂鎖是至關(guān)重要的,因?yàn)樵趦?nèi)存里,它讓當(dāng)下處理的頁只讀:
- 每個(gè)排它閂鎖(Exclusive Latch)和共享閂鎖不兼容。
因此請求一個(gè)排它閂鎖會阻塞,SQL Server會提示你有個(gè)PAGELATCH_EX等待類型。
現(xiàn)在我們來看下在查找操作期間,在索引頁上,SQL Server如何獲取和釋放這些閂鎖。下列代碼展示了對于一個(gè)特定的會話ID,可以捕獲latch_acquired和latch_released事件的擴(kuò)展事件會話(根據(jù)實(shí)際情況修改會話ID)。