Pix*_*ted 11 sql-server sql-server-2008-r2 database-internals sql-server-2012 sql-server-2014
我们看到非常高的 PAGELATCH_EX 和 PAGELATCH_SH 等待类型以及高 WRITELOG 等待。我已经诊断出导致 PAGELATCH 等待的查询,并且可以通过降低插入到使用 IDENTITY 值定义的繁忙集群主键的插入率来消除它们。我知道这种现象被称为最后一页插入闩锁争用。
但是我的问题是,当插入新记录时,SQL Server 是否在缓冲页上取独占 PAGELATCH_EX,将记录插入缓冲页,将记录写入事务日志,然后按详细https://释放独占 PAGELATCH_EX www.microsoft.com/en-ie/download/details.aspx?id=26665 Page 24. 还是先将记录写入事务日志,然后再将 PAGELATCH_EX 作为详细的“Resolving PAGELATCH Contention on High Concurrent”INSERT Workloads -背景信息SQLCAT 的指南:关系引擎
如果记录是在闩锁机制之外写入日志,那么我可以排除由于高 PAGELATCH 等待而导致的缓慢写入磁盘的情况。但是,如果锁存器一直保持到记录被强化记录,那么我可能应该考虑 WRITELOG。
也有多个非聚集索引会导致 PAGELATCH_* 锁存器保持更长时间,即如果一个表有一个聚集和多个非聚集索引,同时向每个索引缓冲区页添加和释放锁存器?
更新 1 阅读confio-sql-server-writelog-wait幻灯片二和一般 WAL 架构后。我现在了解到,两份白皮书中详述的“记录该行已被修改的日志条目”步骤是指 SQL Server 记录事务日志缓存中的更改,而不是磁盘。一旦事务完成或缓冲区已满,所有记录都会立即刷新到磁盘。
然而我的问题是,当插入新记录时,SQL Server是否在缓冲区页上获取独占的PAGELATCH_EX,将记录插入到缓冲区页,将记录写入事务日志,然后释放独占的PAGELATCH_EX
您必须注意,闩锁仅保护页面在内存中时的物理完整性,因此当页面在内存中时将采取闩锁。假设正在插入一条记录并且需要获取该页面。首先,页面将被锁定并放入内存中,然后它将被锁存并写入信息。之后的流程将是
生成日志记录
更新页面 LSN 以匹配日志记录的 LSN
更改数据(弄脏页面)
释放闩锁
提交事务开始
Commit 的 FlushToLSN
释放锁
提交交易完成
有关上述步骤的更多详细信息和说明,请阅读Bob Dorr 的 I/O 演示博客
Pagelatch* 等待是非 I/O 等待,我发现大多数时候这些等待由于分配争用而很突出。我的直觉是它必须与 how 做一些事情tempdb is configured。那么你的 tempdb 是如何配置的?有多少 tempdb 数据文件?确保它们具有相同的自动增长和相同的大小。当创建新页面时,系统页面(例如GAM、SGAM 和 PFS 页面)需要更新或访问,并且当 SQL Server 在访问这些页面时发现争用时,就会出现此类等待。
| 归档时间: |
|
| 查看次数: |
1522 次 |
| 最近记录: |