为啥我的 Sql 查询第二次运行更快?

Posted

技术标签:

【中文标题】为啥我的 Sql 查询第二次运行更快?【英文标题】:Why is my Sql Query is Faster the Second Time it Runs?为什么我的 Sql 查询第二次运行更快? 【发布时间】:2018-10-29 06:45:23 【问题描述】:

每次我在执行 SQL 查询时获得相同的执行时间。 如果 SQL 查询多次运行,是否有机会始终获得相同的执行时间?

【问题讨论】:

也许您可以共享您的表结构、任何索引以及您正在执行的 SQL 语句?可能是索引问题,我可能是由于缓存,可能是查询编译器,但仅凭您提供的信息无法回答。请详细说明。 我猜测缓存的查询计划,但这是一个猜测。添加更多细节,我们可以给出更具体的答案。 @Birel,SQL Server 不存储和重用计算结果。这里的函数没有意义。 【参考方案1】:

当您第一次运行查询并且数据不在缓存中时,服务器会从磁盘读取数据。这是耗时的。第二次执行相同的查询数据已经在缓存中,所以它需要更少的时间。

如果使用 SQL,是否有机会始终获得相同的执行时间 查询运行多次?

如果您想使用冷缓存测试您的查询(每次都没有缓存数据),您可以在执行查询之前使用DBCC DROPCLEANBUFFERS:

使用 DBCC DROPCLEANBUFFERS 测试带有冷缓冲区缓存的查询 无需关闭并重新启动服务器。删除干净的缓冲区 来自缓冲池和来自列存储的列存储对象 对象池,首先使用 CHECKPOINT 产生一个冷缓冲缓存。这 强制将当前数据库的所有脏页写入磁盘 并清理缓冲区。完成此操作后,您可以发出 DBCC DROPCLEANBUFFERS 命令从缓冲池中删除所有缓冲区。

当然这不是在生产环境中使用的。

如果 相反,如果您希望您的数据始终在缓存中,您应该为您的服务器增加 RAM,并且不要尽可能长时间地重新启动它。

【讨论】:

以上是关于为啥我的 Sql 查询第二次运行更快?的主要内容,如果未能解决你的问题,请参考以下文章

为啥Matlab在脚本“预热”后运行得更快?

尝试在短时间内连续第二次运行 SQL 查询时 Java 挂起

为啥 MS-Access 中的 Teradata 查询比 SQL Server 更快

为啥执行存储过程比脚本中的 SQL 查询更快?

为啥使用第一个阅读器 read() 运行第二个阅读器比在自己的阅读器上运行它运行得更快?

SQL Developer 中没有参数的查询运行缓慢