我在SSRS 2005中有一个报告,带有嵌入式SQL查询(没有存储过程)。此报告在SSRS中的运行速度比在SSMS中运行的查询慢。我想知道如何对此进行故障排除,以及查询优化对于嵌入式SQL代码与存储过程的报表的工作方式有何不同。
谢谢!
答案 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'
同时在执行报告时保持探查器运行,以便您可以看到幕后发生的事情。
希望它有所帮助。