SQL Server 2008 R2 中运行缓慢的存储过程

Posted

技术标签:

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

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

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

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

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

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

【问题讨论】:

缓存相关的东西? 【参考方案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秒

以上是关于SQL Server 2008 R2 中运行缓慢的存储过程的主要内容,如果未能解决你的问题,请参考以下文章

将 SQL Server 2008 r2 降级到 SQL Server 2008

SQL Server 2008 r2:如何检查所有视图的运行时错误?

SQL Server 2008 R2 - sqlcmd bat 文件在文件夹中运行一批 sql 查询,但它们没有按文件名的顺序运行

windows server2012 r2能安装sqlserver2008 R2吗

SQL Server 2008 R2升级到SQL Server 2012 SP1

win12安装 sqlserver2008 r2未授权的操作