Answers:
就个人而言,对于常见查询,第二次及其后的执行更为重要。
您是否正在测试磁盘IO或查询性能?
假设您的查询经常运行并且非常关键,那么您希望在现实生活中对其进行测量。而且您不想每次都清除产品服务器缓存...
如果需要,您可以:
DBCC DROPCLEANBUFFERS
从缓冲池中清除干净的(未修改的)页面。先CHECKPOINT
刷新所有脏页面到磁盘DBCC FLUSHPROCINDB
清除该数据库的执行计划另请参阅(在DBA.SE上)
DECLARE @myDb AS INT = DB_ID(); DBCC FLUSHPROCINDB(@myDb); GO
从这里开始: stackoverflow.com/questions/7962789/...
答案较晚,但可能对其他读者有用
DBCC DROPCLEANBUFFERS是用于查询测试和衡量查询执行速度的常用命令。该命令(运行时)仅保留脏页,而脏页实际上是数据的一小部分。它将删除整个服务器的所有干净页面。
建议不要在生产环境上运行此命令。运行此命令将导致缓冲区缓存几乎为空。在执行DBCC DROPCLEANBUFFERS命令之后运行任何查询,将使用物理读取将数据带回到缓存中,这很可能会比内存慢很多。
同样,将此命令与DBCC FREEPROCCACHE一样对待-除非您完全知道自己在做什么,否则不应在任何生产服务器上运行该命令。
这是一个有用的开发工具,因为您可以在性能测试环境中反复运行查询,而不会因内存中的数据缓存而导致速度/效率发生任何变化。
了解更多信息:http : //www.sqlshack.com/insight-into-the-sql-server-buffer-cache/
关于不运行的原因,其他答案是正确的DBCC FREEPROCCACHE
。但是,这样做还有两个原因:
如果要比较两个尝试以不同方式执行相同操作的不同查询或过程,则它们很可能会到达相同的页面。如果您天真地运行查询#1然后查询#2,则第二个查询可能会快得多,这仅仅是因为这些页面是由第一个查询缓存的。如果您在每次执行前清除缓存,它们将从一个稳定的起点开始。
如果确实要测试热缓存性能,请确保多次运行查询,交替运行,并丢弃前几次运行。平均结果。
假设您有一个查询,对高速缓存的查询花费一秒钟,而对高速缓存的查询则花费一分钟。一种优化可使内存中查询慢20%,但使IO绑定查询快20%,这可能是一个大胜利:在正常操作期间,在正常情况下没有人会注意到额外的200毫秒,但是如果某些因素迫使查询执行在磁盘上运行,花费48秒(而不是60秒)可以节省销售。
在具有数十GB内存,相对较快的SAN和SSD存储的现代系统中,这并不是要担心的问题,但这仍然很重要。如果某些分析人员针对您的OLTP数据库运行大型表扫描查询,这会消耗掉一半的缓冲区高速缓存,那么存储效率高的查询将使您更快地恢复速度。
DBCC FLUSHPROCINDB
:向DBCC语句提供了错误的参数数量。