为啥我的 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 查询第二次运行更快?的主要内容,如果未能解决你的问题,请参考以下文章
尝试在短时间内连续第二次运行 SQL 查询时 Java 挂起
为啥 MS-Access 中的 Teradata 查询比 SQL Server 更快