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


46

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

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

DBCC FREESYSTEMCACHE
DBCC FREESESSIONCACHE
DBCC FREEPROCCACHE

实际上,在执行几次查询之后,我的查询比以前花费了更实际的时间。但是,我不确定这是推荐的技术。

最佳做法是什么?

Answers:


44

就个人而言,对于常见查询,第二次及其后的执行更为重要。

您是否正在测试磁盘IO或查询性能?

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

如果需要,您可以:

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

另请参阅(在DBA.SE上)


3
运行时出错DBCC FLUSHPROCINDB:向DBCC语句提供了错误的参数数量。

终于找到了:DECLARE @myDb AS INT = DB_ID(); DBCC FLUSHPROCINDB(@myDb); GO从这里开始: stackoverflow.com/questions/7962789/...
汉斯·沃恩

14

答案较晚,但可能对其他读者有用

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

建议不要在生产环境上运行此命令。运行此命令将导致缓冲区缓存几乎为空。在执行DBCC DROPCLEANBUFFERS命令之后运行任何查询,将使用物理读取将数据带回到缓存中,这很可能会比内存慢很多。

同样,将此命令与DBCC FREEPROCCACHE一样对待-除非您完全知道自己在做什么,否则不应在任何生产服务器上运行该命令。

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

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


9

总是告诉我使用:

dbcc dropcleanbuffers;

MSDN

使用DBCC DROPCLEANBUFFERS可以使用冷缓冲区高速缓存来测试查询,而无需关闭并重新启动服务器。

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


2
另外:DBCC FREEPROCCACHE清除所有缓存的执行计划...
marc_s

1
仅当您要测试IO时,…...
gbn

3

关于运行的原因,其他答案是正确的DBCC FREEPROCCACHE。但是,这样做还有两个原因:

  1. 一致性

如果要比较两个尝试以不同方式执行相同操作的不同查询或过程,则它们很可能会到达相同的页面。如果您天真地运行查询#1然后查询#2,则第二个查询可能会快得多,这仅仅是因为这些页面是由第一个查询缓存的。如果您在每次执行前清除缓存,它们将从一个稳定的起点开始。

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

  1. 最坏情况下的表现

假设您有一个查询,对高速缓存的查询花费一秒钟,而对高速缓存的查询则花费一分钟。一种优化可使内存中查询慢20%,但使IO绑定查询快20%,这可能是一个大胜利:在正常操作期间,在正常情况下没有人会注意到额外的200毫秒,但是如果某些因素迫使查询执行在磁盘上运行,花费48秒(而不是60秒)可以节省销售。

在具有数十GB内存,相对较快的SAN和SSD存储的现代系统中,这并不是要担心的问题,但这仍然很重要。如果某些分析人员针对您的OLTP数据库运行大型表扫描查询,这会消耗掉一半的缓冲区高速缓存,那么存储效率高的查询将使您更快地恢复速度。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.