SQL Server 的文档谈到了在崩溃恢复期间将已提交的事务应用于数据文件,有点像在执行即时检查点。这应该在撤消未提交的事务之前发生,而撤消未提交的事务必须发生才能完成恢复过程。
为什么它会立即将已提交的事务刷新到数据文件中,而不是只将脏数据加载到 RAM 缓存中(与崩溃前数据存储在缓存 + 日志中的方式相同),然后将其作为下一个检查点的一部分写出?这似乎会不必要地延长崩溃恢复时间。
SQL Server 的文档谈到了在崩溃恢复期间将已提交的事务应用于数据文件,有点像在执行即时检查点。这应该在撤消未提交的事务之前发生,而撤消未提交的事务必须发生才能完成恢复过程。
为什么它会立即将已提交的事务刷新到数据文件中,而不是只将脏数据加载到 RAM 缓存中(与崩溃前数据存储在缓存 + 日志中的方式相同),然后将其作为下一个检查点的一部分写出?这似乎会不必要地延长崩溃恢复时间。
它不会直接写入数据文件。该
REDO
过程将根据分析结果将所需的页面加载到内存中,并针对内存中的这些页面重播日志记录,就像 SQL Server 对所有其他修改所做的那样。最终,作为恢复过程的一部分,将发生检查点,并将脏页写入磁盘。如果您有兴趣进一步了解,您可以使用 procmon/etw 自己检查。