我知道SQL Server 2005会执行一些执行计划缓存,但这是否足以在同一个查询运行两次之间创建小时差异?下次需要1分钟第一次需要3个小时?这甚至可能吗?
答案 0 :(得分:3)
SQL Server不仅会缓存执行计划,还会缓存数据
如果你这样做
SET STATISTICS IO ON
并查看输出,您将看到逻辑读取和物理读取,逻辑读取来自RAM,物理读取来自磁盘。因此,第一次看到物理读取的数字时,如果再次运行它,您应该看到逻辑读取的值
3小时似乎很长,也可能是因为阻塞/锁定,陈旧的统计数据等
答案 1 :(得分:0)
区别在于其他地方!
提出查询计划的时间最多只有几秒钟(更糟)。
很可能,差异是由于:
提到的差异: 3小时,大约1分钟左右是如此激烈,以至于我认为单独缓存数据无法解释。 这是有关查询的更多信息将有助于...的地方 例如,即使它是非常相同的查询运行两次,它第二次可能有不同的行为(例如,如果这是更新/插入/删除类型查询,它可能不会需要修改这么多行)。即使是仅SELECT查询也可能以不同方式运行,因为基础数据已被修改(通过其他查询/进程)。
以下是一些了解更多信息的建议:
清除缓存的语句是(对于较新版本的SQL-Server,可能还有其他方法可以这样做):
dbcc freeproccache
go
dbcc dropcleanbuffers
go
答案 2 :(得分:0)
理论上,当第一次运行(“冷运行”)时,您的查询所需的表和索引页可能位于磁盘上。查询获取了它们,引擎将它们放入缓存中。
查询的第二次运行(“热运行”)仅使用缓存中的数据,当然要快得多。
然而,即使是最大的缓存,3个小时也足以填充,所以情况几乎不可能。
最有可能的是,第二次运行中使用了另一个执行计划(可能是由于统计信息更新)。
答案 3 :(得分:0)
没有。很可能是您的查询第一次被阻止(例如,通过另一个会话或增长事件),而第二次则不是。
举例说明:INSERT INTO Table (Field) VALUES (1)
。简单的查询,但是当你第一次运行它时,数据库已满并且必须增长。数据库为750GB,默认增长率为10%,因此必须创建75GB,因为SQL Server服务帐户未被授予Perform Volume Maintenance Tasks,因此增长持续约30分钟。然后再次运行查询,只需不到一秒钟。
这里指的不是您在执行期间发生过增长事件。重点是,如果查询持续3个小时,您需要了解为什么。 Activity Monitor是一个很好的开始。阅读像Performance Tunning Wait Queues这样的白皮书会更好。