触发缓冲池扫描的操作可能会在大型内存计算机上运行缓慢

本文介绍如何在大型内存计算机上扫描 SQL Server 缓冲池可能需要很长时间才能完成。

适用范围:SQL Server
原始 KB 数: 4566579

现象

Microsoft SQL Server 中的某些操作会触发对缓冲池(将数据库页存储在内存中的缓存)的扫描。 在具有大量 RAM(1 TB 内存或更大)的系统上,扫描缓冲池可能需要较长时间。 这会减缓触发扫描的操作。

导致缓冲池扫描的操作

下面是一些可能会触发缓冲池扫描的操作:

  • 数据库启动
  • 数据库关闭或重启
  • AG 故障转移
  • 数据库删除(删除)
  • 从数据库中删除文件
  • 完整或差异数据库备份
  • 数据库还原
  • 事务日志还原
  • 联机还原
  • DBCC CHECKDBDBCC CHECKTABLE 操作

错误日志显示扫描花费了很长时间

SQL Server 2016 SP3SQL Server 2017 CU23SQL Server 2019 CU9 开始,SQL Server 错误日志 中添加了一条错误消息,指示缓冲池扫描花费了很长时间(10 秒或更长时间):

缓冲池扫描花费了 14 秒:数据库 ID 7、命令“BACKUP DATABASE”、操作“FlushCache”、扫描缓冲区 115、总迭代缓冲区204640239,等待时间 0 毫秒。 有关更多信息,请参阅 'https://go.microsoft.com/fwlink/?linkid=2132602'。

用于诊断长时间扫描的扩展事件

此外,从相同的内部版本 SQL Server 2016 SP3SQL Server 2017 CU23SQL Server 2019 CU9 开始,引入了buffer_pool_scan_complete 扩展事件来帮助识别长缓冲池扫描。

如果扫描需要 1 秒以上,则会在启用事件时按如下所示记录 XEvent。

name database_id elapsed_time_ms 命令 operation scanned_buffers total_iterated_buffers
buffer_pool_scan_complete 7 1308 BACKUP DATABASE FlushCache 243 19932814

注意

阈值在 XEvent 中较小,可让你以更精细的粒度捕获信息。

解决方法

在 SQL Server 2022 之前,无法消除此问题。 不建议执行任何操作来清除缓冲池,因为从缓冲池中删除干净缓冲区(DBCC DROPCLEANBUFFERS)可能会导致性能显著下降。 从内存中删除数据库页将导致后续查询执行从磁盘上的数据库文件重新读取数据。 通过磁盘 I/O 访问数据的过程会导致查询速度缓慢。

在 SQL Server 2022 中,此问题会缓解,因为缓冲池扫描通过利用多个核心并行化。 每个 800 万缓冲区(64 GB)将有一个任务,如果缓冲区少于 800 万,则仍会使用串行扫描。 有关详细信息,请查看 缓冲池并行扫描

详细信息

有关大型缓冲池中可能发生的问题的详细信息,请参阅 SQL Server:大型 RAM 和数据库检查点