SSRS 2005故障排除报告运行缓慢

时间:2010-09-15 22:03:22

标签: reporting-services query-optimization

我在SSRS 2005中有一个报告,带有嵌入式SQL查询(没有存储过程)。此报告在SSRS中的运行速度比在SSMS中运行的查询慢。我想知道如何对此进行故障排除,以及查询优化对于嵌入式SQL代码与存储过程的报表的工作方式有何不同。

谢谢!

2 个答案:

答案 0 :(得分:0)

从SSMS运行查询与报表之间可能存在差异,但SQL Server查询优化不是这样。换句话说,SQL Server并不关心查询的来源。

首先,您应该使用SQL事件探查器从两个源运行时捕获查询。您可以看到真正的性能差异是由于SQL Server上的时间而不是其他原因造成的。此外,通过结果,您可以查看查询是否相同。 SSRS可能使用参数化查询,它实际上与您在SSMS中运行的查询不同。

是否有大量数据返回到报告中?您可能会看到时间差异,因为结果会更快地返回到SSMS。

答案 1 :(得分:0)

存储过程和通过ssrs的查询都将被参数化,因此它们应该以相同的方式缓存,尽管它们将是2个不同的缓存。如果我是你,我将首先检查报表服务器数据库上的执行日志,以找出问题的来源。

这是一个脚本,它将向您显示获取数据,处理和呈现所需的时间。

select
       reverse ( substring ( reverse ( el . ReportPath ), 1 , charindex ( '/' , reverse ( el . ReportPath ))- 1 )) as ReportName
       , u . UserName as LastModBy
       , coalesce ( cast ( el . parameters as varchar ( max )), '' ) as [Parameters]
       ,( select count (*) from executionlog2 tmp where tmp . reportpath = el . reportpath and tmp . username = el . username and tmp . reportaction = 'Render' and tmp . status = 'rsSuccess' group by tmp . ReportPath ) as UserCount60Day
       , el . Format
       , el . UserName
       , el . ReportAction
       , el . Status
       , el .Source
       , el . [RowCount]
       , el . ExecutionId
       , el . TimeDataRetrieval / 1000 as DataRetrieval
       , el . TimeProcessing / 1000 as Processing
       , el . TimeRendering / 1000 as Rendering
       ,( el . TimeProcessing + el . TimeRendering ) / 1000 as ProcessAndRender
       , el . AdditionalInfo
       , case
             when datediff ( ss , el . TimeStart , el . TimeEnd ) >= 30
                   then 1
             else 2
       end as DisplayInRed

from
      ExecutionLog2 el
       join ReportServer . dbo . Catalog c  
             on c . Path = el . ReportPath
       join ReportServer . dbo . Users u  
             on u . UserId = c . ModifiedByID

where
      el . ReportAction = 'Render'

同时在执行报告时保持探查器运行,以便您可以看到幕后发生的事情。

希望它有所帮助。