我们看到非常高的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在事务日志缓存(而不是磁盘)中记录更改。一旦事务完成或缓冲区已满,所有记录将立即刷新到磁盘。