发出 CHECKPOINT 后的脏缓冲区页

Flo*_*ian 5 sql-server checkpoint sql-server-2016

我目前正在开发一个测试系统,并且由于我想要优化的查询的性质,我正在尝试尽可能模拟“冷”读取。其中一部分是在执行查询之前清除缓冲区缓存。从我可以找到的所有内容中,应该在检查点期间写入脏缓冲区页面。但是,即使在发出 CHECKPOINT 之后,缓冲池中似乎仍然有 169 个我的数据库的脏页(通过 评估SELECT * FROM sys.dm_os_buffer_descriptors WHERE database_id=7 AND is_modified=1)。

我对检查点或 sys.dm_os_buffer_descriptors 的内容有什么误解吗?如果没有,为什么我应该写掉它们之后我仍然有脏页?

Jos*_*ell 9

手册CHECKPOINT 应该将所有脏页写入磁盘。它针对为您的连接处于活动状态的数据库执行此操作,而不是针对所有数据库。确保当前数据库的名称database_id=7是:

USE [YourDatabaseName];
GO

CHECKPOINT;
GO

SELECT * 
FROM sys.dm_os_buffer_descriptors 
WHERE database_id = 7 AND is_modified = 1;
Run Code Online (Sandbox Code Playgroud)

请参阅检查点如何工作以及记录的内容

数据库的所有脏数据文件页面都写入磁盘(自从磁盘读取或自上次检查点以来在内存中发生更改的所有页面),无论进行更改的事务的状态如何。

数据库检查点(SQL Server)

姓名 Transact-SQL 接口 描述
手动的 CHECKPOINT [checkpoint_duration] 当您执行 Transact-SQL CHECKPOINT 命令时发出。手动检查点发生在您的连接的当前数据库中...

需要注意的是一的事情能引起脏页显示在sys.dm_os_buffer_descriptors所有显式(用户发起)后的写操作完成。其中一些可能是为了响应SELECT查询:

  • 来自计划编译的同步或异步统计更新
  • 查询存储数据收集

或者由于与特定 SQL Server 功能相关的后台任务:

  • 列存储元组移动器
  • 延迟删除(如果表被截断或删除,但范围仍在后台释放
  • 更改跟踪自动清理
  • PVS 清理(如果在 SQL Server 2019 上使用加速数据库恢复)

这不是一个详尽的列表,但可以让您了解,除了插入、更新和删除之外,您可能会出于多种原因看到脏页。