在数据库引擎中写入页面

适用于:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics分析平台系统(PDW)Microsoft Fabric中的SQL数据库

数据库引擎实例的 I/O 包括逻辑写入和物理写入。 修改缓冲区缓存中页的数据时发生逻辑写入。 将页从 缓冲区缓存 写入磁盘时,发生物理写入。

在缓冲区缓存中修改页面时,不会立即将其写回到磁盘;而是将页面标记为脏。 这意味着页面在物理写入磁盘之前,可以有多个逻辑写入。 对于每次逻辑写入,都会在记录修改的日志缓存中插入一条事务日志记录。 在将关联的脏页从缓冲区缓存中删除并写入磁盘之前,必须将这条些日志记录写入磁盘。

SQL Server 使用一种称为预写日志记录(WAL)的技术,该技术可防止在将关联的日志记录写入磁盘之前写入脏页。 这对于保证恢复管理器的正常工作至关重要。 有关详细信息,请参阅 预写事务日志

SQL Server 如何写入修改的数据页

下图显示了写入修改后的数据页的过程。

Writing_Pages的屏幕截图。

在缓冲区管理器写入页时,它会搜索可通过一次聚集-写入操作写入的相邻脏页。 相邻页具有连续的页面 ID,并且来自同一个文件;页面不必在内存中连续。 直到发生下列事件之一,才会停止向前和向后的搜索:

  • 找到一个干净页。
  • 已找到 32 页。
  • 发现一个脏页,其日志序列号(LSN)尚未在日志中刷新。
  • 发现无法立即闩锁的页面。

通过这种方式,可以通过一次聚集-写入操作将整组页写入磁盘。

仅在写入页之前,才会把数据库中指定的页保护形式添加到该页。

  • 如果添加了撕裂的页面保护,则必须为 I/O 以独占方式(EX)锁定页面。 这是因为残缺页保护会修改该页,使其不适合任何其他线程读取。

  • 如果添加了校验和页保护或数据库未使用页面保护,则该页面将在 I/O 操作中使用更新(UP)闩锁锁定。 该闩锁可防止任何其他人在写入期间修改该页,但仍然允许读取者使用它。

有关磁盘 I/O 页面保护选项的详细信息,请参阅 缓冲区管理

如何将脏页写入磁盘

脏页写入磁盘的方式有三种:

惰性写入、即时写入和检查点进程不会等待 I/O 操作完成。 它们始终使用异步(或重叠)I/O,并将继续执行其他工作,之后再检查 I/O 是否成功。 因此,SQL Server 在执行相应任务时可充分利用 CPU 和 I/O 资源。

延迟写入过程

惰性编写器是一个系统进程,它会删除缓冲区高速缓存中的不常用页,以保证存在可用的缓冲区。 首先将脏页写入磁盘。

预先写入过程

勤奋写入进程会写入与最少记录的操作(例如大容量插入和选择插入)相关联的脏数据页。 该进程允许以并行方式创建和写入新页。 也就是说,调用操作无需等待整个操作完成,就可以开始将页面写入磁盘。

检查点进程

检查点进程定期在缓冲区高速缓存中扫描包含来自指定数据库的页的缓冲区,然后将所有脏页写入磁盘。 CHECKPOINT 可创建一个检查点,在该点保证全部脏页都已写入磁盘,从而在以后的恢复过程中节省时间。

用户可以使用 CHECKPOINT 命令请求检查点操作,或者数据库引擎可能会根据上次检查点以来日志空间使用量和时间的流逝自动生成检查点。 另外,在发生特定活动时会生成检查点。 例如,在数据库中添加或删除了数据或日志文件时,或在 SQL Server 实例停止时。

有关详细信息,请参阅 检查点和日志的活动部分