高 PAGELATCH_* 和 WRITELOG 等待。他們有關係嗎?
我們看到非常高的 PAGELATCH_EX 和 PAGELATCH_SH 等待類型以及高 WRITELOG 等待。我已經診斷出導致 PAGELATCH 等待的查詢,並且可以通過降低插入到使用 IDENTITY 值定義的繁忙集群主鍵的插入率來消除它們。我知道這種現像被稱為最後一頁插入閂鎖爭用。
但是我的問題是,當插入新記錄時,SQL Server 是否在緩衝區頁面上採用獨占 PAGELATCH_EX,將記錄插入緩衝區頁面,將記錄寫入事務日誌,然後詳細釋放獨占 PAGELATCH_EX https:// www.microsoft.com/en-ie/download/details.aspx?id=26665第24頁。還是先將記錄寫入事務日誌,然後再將PAGELATCH_EX作為詳細的“解決高並發上的PAGELATCH爭用”插入工作負載-背景資訊SQLCAT’s Guide to: Relational Engine
如果記錄被寫入鎖存機制之外的日誌,那麼我可以排除緩慢寫入磁碟是導致高 PAGELATCH 等待的原因。但是,如果鎖存器一直保持到記錄被硬化記錄,那麼我可能應該考慮 WRITELOG。
還有多個非聚集索引會導致 PAGELATCH_* 鎖存器保持更長時間,即,如果一個表有一個聚集的並且多個非聚集索引是同時添加並釋放到每個索引緩衝區頁面的鎖存器?
更新 1 在閱讀了 conio-sql-server-writelog-wait幻燈片二和一般 WAL 架構之後。我現在了解到,兩份白皮書中詳述的“記錄已修改行的日誌條目”步驟是指 SQL Server 在事務日誌記憶體中記錄更改,而不是在磁碟中記錄更改。一旦事務完成或緩衝區已滿,所有記錄都會立即刷新到磁碟。
但是我的問題是,當插入新記錄時,SQL Server 是否在緩衝區頁面上採用獨占 PAGELATCH_EX,將記錄插入緩衝區頁面,將記錄寫入事務日誌,然後釋放獨占 PAGELATCH_EX
您必須注意,鎖存器僅在頁面位於記憶體中時保護頁面的物理完整性,因此當頁面位於記憶體中時會使用鎖存器。假設正在插入一條記錄,並且需要獲取該頁面。首先,頁面將被鎖定並帶入記憶體,然後將被鎖存並寫入資訊。之後的過程是
- 生成日誌記錄
- 更新頁面 LSN 以匹配日誌記錄
- 更改數據(弄髒頁面)
- 釋放閂鎖
- 送出事務開始
- 送出的 FlushToLSN
- 釋放鎖
- 送出事務完成
有關上述步驟的更多詳細資訊和說明,請閱讀Bob Dorr 的 I/O 展示部落格
Pagelatch* 等待是非 I/O 等待,我看到大多數時候這些等待由於分配爭用而很突出。我的預感是它必須與 how
tempdb is configured
. 那麼您的 tempdb 是如何配置的?存在多少 tempdb 數據文件?確保它們具有相同的自動增長和相同的大小。當創建新頁面時,需要更新或訪問諸如GAM、SGAM 和 PFS 頁面之類的系統頁面,並且當 SQL Server 在訪問這些頁面時發現爭用時,就會出現這種等待。