在运行性能比较之前清除缓存的 SQL Server 命令

and*_*ena 50 performance sql-server performance-testing

在比较两个不同查询的执行时间时,清除缓存以确保第一个查询的执行不会改变第二个查询的性能非常重要。

在 Google 搜索中,我可以找到以下命令:

DBCC FREESYSTEMCACHE
DBCC FREESESSIONCACHE
DBCC FREEPROCCACHE
Run Code Online (Sandbox Code Playgroud)

事实上,在多次执行后,我的查询需要比以前更现实的时间来完成。但是,我不确定这是推荐的技术。

最佳做法是什么?

gbn*_*gbn 46

就个人而言,对于常见查询,第二次和后续执行更重要。

您是在测试磁盘 IO 还是查询性能?

假设您的查询经常运行并且很关键,那么您希望在现实生活条件下对其进行测量。而且您不想每次都清除生产服务器缓存...

如果您愿意,您可以:

  • DBCC DROPCLEANBUFFERS从缓冲池中清除干净(未修改)的页面 先
    用 aCHECKPOINT将任何脏页面刷新到磁盘
  • DBCC FLUSHPROCINDB 清除该数据库的执行计划

另见(在 DBA.SE 上)

  • 运行“DBCC FLUSHPROCINDB”时出错:为 DBCC 语句提供的参数数量不正确。 (3认同)

小智 15

迟到的答案,但可能对其他读者有用

DBCC DROPCLEANBUFFERS是查询测试和衡量查询执行速度的常用命令。这个命令(运行时)只留下脏页,这实际上是一小部分数据。它删除整个服务器的所有干净页面。

注意,这个命令应该不会对生产环境中运行。运行此命令将导致大部分缓冲区缓存为空。在执行DBCC DROPCLEANBUFFERS命令后运行任何查询,将使用物理读取将数据带回缓存,这很可能比内存慢很多。

同样,将此命令视为类似DBCC FREEPROCCACHE- 它不应在任何生产服务器上运行,除非您完全知道自己在做什么。

这可能是一个有用的开发工具,因为您可以在性能测试环境中一遍又一遍地运行查询,而不会由于在内存中缓存数据而导致速度/效率发生任何变化。

了解更多信息:http : //www.sqlshack.com/insight-into-the-sql-server-buffer-cache/


小智 11

我总是被告知要使用:

dbcc dropcleanbuffers;
Run Code Online (Sandbox Code Playgroud)

MSDN

使用 DBCC DROPCLEANBUFFERS 来测试具有冷缓冲区缓存的查询,而无需关闭和重新启动服务器。

要从缓冲池中删除干净的缓冲区,首先使用 CHECKPOINT 生成冷缓冲区缓存。这会强制将当前数据库的所有脏页写入磁盘并清理缓冲区。执行此操作后,您可以发出 DBCC DROPCLEANBUFFERS 命令以从缓冲池中删除所有缓冲区。

  • 加:`DBCC FREEPROCCACHE` 清除任何缓存的执行计划...... (2认同)

Jon*_*des 5

编辑:OP 的问题是关于缓存,以及DBCC FREEPROCCACHE清除存储的执行计划等命令的使用。显然我没有戴眼镜,因为我的回答涉及缓冲区,也就是说最近读取的数据存储在内存中以便快速检索。希望这对某人仍然有用。


关于运行的原因,其他答案是正确的[DBCC DROPCLEANBUFFERS][1]。但是,这样做也有几个原因:

1:一致性

如果您想比较两个试图以不同方式执行相同操作的不同查询或过程,它们很可能会访问相同的页面。如果您天真地运行查询 #1 然后查询 #2,则第二个可能会快得多,因为这些页面已被第一个查询缓存。如果您在每次执行之前清除缓存,它们就会以均匀的基础开始。

如果您确实想测试热缓存性能,请确保多次运行查询,交替并丢弃前几次运行。平均结果。

2:最坏情况下的性能

假设您有一个查询,它对热缓存需要一秒钟,但对冷缓存需要一分钟。使内存中查询慢 20% 但 IO 绑定查询快 20% 的优化可能是一个巨大的胜利:在正常情况下,没有人会关心额外的 200 毫秒运行时间,但如果某些事情迫使查询对磁盘运行,花费 48 秒而不是 60 秒很重要。这可能足以挽救销售。

对于拥有数十 GB 内存和相对较快的 SAN 和 SSD 存储的现代系统来说,这不是什么问题,但它仍然很重要。如果某些分析师对您的 OLTP 数据库运行大量表扫描查询,这会清除一半的缓冲区缓存,则存储高效的查询将使您更快地恢复速度。