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

本文介绍了在大内存计算机上扫描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”。

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

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

如果扫描花费的时间超过 1 秒,则启用事件时,将按如下所示记录 XEvent。

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

注意

XEvent 中的阈值较小,以便可以更精细地捕获信息。

解决方法

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

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

更多信息

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