SSRS报告非常慢,但SQL查询运行速度很快

Vik*_*kas 5 sql-server-2008-r2

我花了几个小时来解决这个问题,我需要一些新观点...

我们在SSRS中有一个相对简单的报告设置,简单的矩阵,顶部有列,数据点也有下降.报告背后的SQL查询是"中等"复杂性 - 有一些子查询和几个连接,但没有什么真正的疯狂.

报告已经好几个月了,最近变得非常缓慢.比如,生成报告需要15-20分钟.我可以将SQL查询从报表设计器剪切并粘贴到SQL Mgmt Studio中,替换必要的变量,并在不到2秒的时间内完成结果.我甚至使用SQL分析器来获取SSRS正在执行的确切查询,并将其剪切并粘贴到Mgmt Studio中,仍然是同样的,亚秒结果.指定的参数和日期范围没有任何区别,我可以设置参数来返回一个小数据集(<100行)或一个巨大的数据集(> 10,000行),结果仍然相同; 在Mgmt Studio中超快,但生成SSRS报告需要20分钟.

我到目前为止尝试过的故障排除:在SSRS中删除并重新部署报告.在多台计算机和SSRS服务器上的Visual Studio IDE中进行测试,两个位置的速度相同(约20分钟)使用SQL事件探查器监视执行报告的SPID,捕获正在执行的所有SQL语句,并单独尝试(和一起) Mgmt Studio - 在Mgmt Studio中快速运行(<2秒)在报告执行期间监控服务器性能.在生成20分钟报告期间,处理器非常重要,磁盘I/O略高于基线

Rob*_*Rob 6

检查两者的执行计划,以确保参数嗅探和/或set_options中的差异的组合未生成两个单独的执行计划.

这是我在从ADO.Net和SSMS执行查询时遇到的情况.当使用不同的选项创建不同的执行计划时,会出现问题.SQL Server利用传入的参数值来尝试进一步优化生成的执行计划.我发现每个生成的执行计划都使用了不同的参数值,从而产生了最优和次优计划.我目前无法找到原始查询来查看此内容,但快速搜索显示此文章与同一问题有关.

http://www.sqlservercentral.com/blogs/sqlservernotesfromthefield/2011/10/25/multiple-query-plans-for-the-same-query_3F00_/

如果你正在使用SQL Server 2008,还有一个通过查询提示提供的替代方案称为"OPTIMIZE FOR UNKNOWN",这实际上禁用了参数嗅探.以下是一篇文章的链接,该文章帮助我对此功能的原始研究.

http://blogs.msdn.com/b/sqlprogrammability/archive/2008/11/26/optimize-for-unknown-a-little-known-sql-server-2008-feature.aspx

对于早于2008的版本,上述替代方法是将参数值存储在过程中的局部变量中.这与上面的查询提示的行为方式相同.这个提示来自下面的文章(在编辑中).


编辑

更多的搜索已经挖掘出一篇文章,对该主题进行了非常深入的分析,如果有任何用途,请链接如下.

http://www.sommarskog.se/query-plan-mysteries.html


小智 5

这个问题也一直困扰着我们。我们正在运行来自 CRM 2011 的 SSRS 报告。我尝试了许多建议的解决方案(将输入参数映射到局部变量,将 WITH RECOMPILE 添加到存储过程),但没有任何运气。

这篇关于报表服务器应用程序内存配置的文章 ( http://technet.microsoft.com/en-us/library/ms159206.aspx ),更具体地说,将 4000000 值添加到我们的 RSReportServer.config 文件解决了这个问题。

需要 30-60 秒才能呈现的报告现在可以在不到 5 秒的时间内完成,这与在 SSMS 中执行底层存储过程所需的时间大致相同。