SSRS优化-sqlserver2008R2中单独执行存储过程很快,但在SSRS报表中执行缓慢

浏览: 2066

这个问题困扰了我两天,最后各种尝试解决了,现在写出来,如果大家有这样的情况,试试我的方法,少走弯路

查看对应报表中执行时间,发现大部分执行时间是在 字段 TimeDataRetrieval 上

SELECT  C.Name                         AS ReportName
,E.ReportID AS ReportID
,E.UserName AS UserName
,E.Format AS Format
,E.Parameters AS Parameters
,E.TimeStart AS TimeStart
,E.TimeEnd AS TimeEnd
,E.TimeDataRetrieval*1.0/1000 AS TimeDataRetrieval
,E.TimeProcessing*1.0/1000 AS TimeProcessing
,E.TimeRendering*1.0/1000 AS TimeRendering
,DATEDIFF(SECOND, TimeStart, TimeEnd)
AS CostTime
FROM ReportServer.dbo.ExecutionLog E WITH(NOLOCK)
INNER JOIN ReportServer.dbo.Catalog C WITH(NOLOCK)ON E.ReportID = C.ItemID
WHERE C.Name ='TradeGeneralCommodity'
AND E.TimeStart > CAST('2016-04-11 00:00:00' AS DATETIME)
AND E.TimeStart <= CAST('2016-04-11 23:59:59' AS DATETIME)
ORDER BY TimeStart DESC
TimeStart	TimeEnd	TimeDataRetrieval	TimeProcessing	TimeRendering	CostTime
2016-04-11 13:54:54.857 2016-04-11 14:25:48.357 1853.333000 0.023000 0.000000 1854
2016-04-11 18:54:21.843 2016-04-11 19:25:11.823 1849.914000 0.018000 0.000000 1850
2016-04-11 13:51:05.190 2016-04-11 14:21:48.413 1843.020000 0.036000 0.000000 1843
2016-04-11 13:57:44.603 2016-04-11 14:27:48.367 1803.641000 0.021000 0.000000 1804
2016-04-11 09:51:01.037 2016-04-11 09:51:28.957 27.128000 0.345000 0.413000 27
2016-04-11 13:17:09.913 2016-04-11 13:17:31.927 21.166000 0.473000 0.326000 22
2016-04-11 10:26:28.457 2016-04-11 10:26:45.540 16.204000 0.492000 0.353000 17

接下来,通过SQL Server Profiler 抓执行报表的sql

比如这个过程有5步的执行sql,发现到第3步的时候卡住了

当我把这个卡主的sql单独执行的时候2s中就出结果,然后我在想,既然这个存储过程整体执行不慢,加载到SSRS中执行很慢,原来这个存储过程结构有修改调整,

那么可能就是这个存储过程没有安装最新的执行计划来执行

,重新编译存储过程 :exec sp_recompile @objname='procedureName'  ,编译后 果然在报表中查询的速度和单独执行存储过程一样,问题解决了

解决方法2:在存储过程中添加 重新编译的关键代码: with recompile

CREATE PROCEDURE procedureName
@starttime DATETIME ,
@endtime DATETIME
WITH RECOMPILE
AS
BEGIN
SET NOCOUNT ON;

SELECT GETDATE()
END
推荐 4
本文由 silent_很 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

3 个评论

思路很清晰,谢谢
调用SQL后台存储过程时,有时突然就变得很慢,在后台直接执行存储过程没问题,但在前台调用存储过程时就是很慢,而且在前台调用成功后,再次调用还是一样的慢,但更新一下存储过程再调用就很快了。但这始终不能彻底解决问题,过段时间又会出来同样的问题。环境(NET4.0+SQL2008R2)

解决办法:
方法一:在可能比较耗时的语句后面加上option(recompile)

方法二:强制编译存储过程
SQL Server 提供三种重新编译存储过程的方法:
(1)、sp_recompile 系统存储过程强制在下次运行存储过程时进行重新编译。
示例:exec sp_recompile 存储过程名

(2)、创建存储过程时在其定义中指定 WITH RECOMPILE 选项,表明 SQL Server 将不对该存储过程计划进行高速缓存;该存储过程将在每次执行时都重新编译。
示例:Create Proc 存储过程名 WITH RECOMPILE AS 参数

(3)、在执行存储过程时指定 WITH RECOMPILE 选项,可强制对存储过程进行重新编译。仅当所提供的参数不典型,或者自创建该存储过程后数据发生显著更改时才应使用此选项。
示例:存储过程名 WITH RECOMPILE
谢谢补充,更详细些

要回复文章请先登录注册