高PAGELATCH_ *和WRITELOG等待。他们有关系吗?


11

我们看到非常高的PAGELATCH_EX和PAGELATCH_SH等待类型以及较高的WRITELOG等待。我已经诊断出导致PAGELATCH等待的查询,并且可以通过降低插入由IDENTITY值定义的繁忙集群主键的插入率来消除它们。我知道这种现象被称为最后一页插入闩锁争用。

但是我的问题是,当插入新记录时,SQL Server是否在缓冲区页面上执行排他的PAGELATCH_EX,将记录​​插入缓冲区页面,将记录写入事务日志,然后释放排他的PAGELATCH_EX,详情如下:https:// www.microsoft.com/zh-cn/download/details.aspx?id=26665第24页。还是先将记录写到事务日志中,然后再进行PAGELATCH_EX的详细说明,“解决高度并发的PAGELATCH争用-插入工作负载-背景信息SQLCAT的指南:关系引擎

如果将记录写到锁存机制之外的日志中,那么我可以排除对磁盘的慢速写入,这是导致PAGELATCH等待时间较长的原因。但是,如果保持闩锁直到记录难以记录,那么我应该考虑WRITELOG。

同样,具有多个非聚集索引会导致PAGELATCH_ *锁存器保持更长的时间,即,如果表具有聚簇且多个非聚簇索引被同时添加并释放到每个索引缓冲区页的锁存器?

更新1 阅读confio-sql-server-writelog-wait幻灯片2和一般的WAL体系结构之后。现在,我的理解是,两本白皮书中详细介绍的“记录行已被修改的日志条目”步骤是指SQL Server在事务日志缓存(而不是磁盘)中记录更改。一旦事务完成或缓冲区已满,所有记录将立即刷新到磁盘。


1
看着一个问题非常相似,这种权利这一刻..
戴夫·劳伦斯

您是否调查过可能导致问题的高VLF?
Kin Shah 2015年

@Kin的意思是慢速刷新磁盘以保持PAGELATCH_EX锁存并导致锁存争用吗?
像素化2015年

没有理由,SQL Server的实现必须在页面锁存器下生成日志记录。他们为什么要这样做呢?难以置信。另外,如果日志记录是在patchlatch下完成的,则几乎不会看到WRITELOG等待。一次只能有一种等待类型。
usr

Answers:


1

但是我的问题是,当插入新记录时,SQL Server是否在缓冲区页面上执行独占PAGELATCH_EX,将记录​​插入缓冲区页面,将记录写入事务日志,然后释放独占PAGELATCH_EX

您必须注意,闩锁仅保护页面在内存中时的物理完整性,因此当页面在内存中时将采用闩锁。假设正在插入一条记录,并且需要获取该页面。首先,页面将被锁定并带入内存,然后将其锁存并写入信息。之后的过程将是

  • 生成日志记录

  • 更新页面LSN以匹配日志记录的页面

  • 更改数据(页面脏)

  • 释放闩锁

  • 提交交易开始

  • 提交的FlushToLSN

  • 释放锁

  • 提交交易完成

有关以上步骤的更多详细信息和说明,请阅读Bob Dorr的I / O演示博客

Pagelatch *等待不是非I / O等待,并且由于分配争用,我大多数时候都看到了这些等待。我的直觉是它必须与如何做某事tempdb is configured。那么您的tempdb是如何配置的?存在多少tempdb数据文件?确保它们具有相同的自动增长和相同的大小。当创建新页面时需要更新或访问GAM,SGAM和PFS之类的系统页面或者当SQL Server在访问这些页面时发现争用时,这种等待就成为现实。


@Shanky,您好,基于sys.dm_os_waiting_tasks.resource_description以及DBCC PAGE和PAGELATCH_ *的类型,我已经排除了tempDB。根据Bob Dorr的事件链,看起来“生成日志记录”步骤是在闩锁机制中完成的吗?
Pixelated

3
两者都是互斥的事件,日志文件的写入与在实际提交事务之前按照WAL协议锁定其仅SQL Server以便在日志中写入信息
无关
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.