【问题标题】:Slow running stored procedure in SQL Server 2008 R2SQL Server 2008 R2 中运行缓慢的存储过程
【发布时间】:2014-05-14 15:45:18
【问题描述】:

因此,我很少会完全糊涂,但想看看其他人对我正在经历的事情的看法。

我被要求查看一个运行缓慢的存储过程。目前运行大约需要 8-12 分钟。

所以我注意到一个有用的索引丢失并添加了它 - 现在需要 8 秒。但是,如果我重新启动 SQL Server 并重新运行存储过程,则需要 8-12 分钟。

如果我然后停止查询并删除新索引,然后重新运行存储的过程,它又需要几秒钟。奇怪。

有没有人经历过这样的事情?如果这有什么不同,则存储过程正在调用视图。

【问题讨论】:

  • 缓存相关的东西?

标签: sql sql-server sql-server-2008 stored-procedures views


【解决方案1】:

问。 if I restart SQL Server and re-run the stored proc it's taking 8-12 minutes again.

当您执行查询时,数据会以块的形式读入内存。这些块保留在内存中,但它们会“老化”。这意味着块被标记为最后一次访问,并且当 Sql Server 需要另一个块进行新查询并且内存缓存已满时,最近最少使用的块(最旧的)将被踢出内存。 (在大多数情况下 - 全表扫描块会立即老化,以防止全表扫描超出内存和阻塞服务器)。

问。 If I then stop the query and delete the new index then re-run the stored proc it takes seconds again.

这里发生的情况是,第一次查询的内存中的数据块尚未被踢出内存,因此可以用于第二次查询,这意味着避免了磁盘访问并提高了性能。

【讨论】:

  • 感谢您的快速响应.. 这很有意义.. 但如果我重新启动 SQL Server.. 运行查询并在 10 秒左右取消它.. 添加索引并重新运行它仍然在几秒钟内完成.. 再次重新启动 SQL 服务器.. 重新运行查询并在 30 秒处停止它.. 删除索引并在几秒钟内再次运行!
  • 检查查询的执行计划...有没有索引有区别吗?我怀疑删除索引后,执行计划保持不变...
  • 所以我将执行计划保存为 XML,并比较了使用带和不带索引的 kdiff3.. 似乎有很大的不同
  • 在发布之前,我已经做了一些进一步的测试,得到了一些奇怪的结果。 1.重启SQL server实例并运行查询(查询时间10m>) 2.添加查询计划建议的两个索引中的1个(耗时12秒) 3.再次运行查询(耗时2秒) 4.调用CHECKPOINT; DBCC 删除缓冲区;重新运行查询(需要 12 秒) 5. 再次运行(2 秒) 6. 重新启动 SQL 服务器实例(10m > 再次) 7. 删除重新启动前添加的索引(12 秒)如果我重新启动 SQL 服务器实例并运行查询..运行一秒后取消它,添加或删除索引并再次运行需要12秒
猜你喜欢
  • 1970-01-01
  • 2015-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多