请教,SSRS报表运行慢,发现ExecutionLog中TimeRendering耗时长,如何优化?
0
数据大概25M,TimeRendering需要15s,服务器cpu、内存都很空余,有没有办法优化?
没有找到相关结果
重要提示:提问者不能发表回复,可以通过评论与回答者沟通,沟通后可以通过编辑功能完善问题描述,以便后续其他人能够更容易理解问题.
1 个回复
郑大鹏 2017-01-10 回答
赞同来自: hide 、magicyang5000
你的报表是用来做什么什么的我不知道,只想说如果显示的数据不是很多的话,最好把计算结果在SQL计算好,最终数据再呈现出来!本身25M数据,传输就需要很多时间。
其它方面的优化你可以参考下这个
优化报表速度可以从这几个方面入手:
1. 减少数据集查询返回到报表的数量,比如返回 10W条和返回 1000 条到报表端的效果是不一样的。从源端查询的数据保存在 Dataset 数据集中,数据集中的数据实际上是保存在报表服务器中的 ReportServer / ReportServerTemp 其中一个数据库。返回的量越少,IO开销越少,速度越快。
2. 返回到数据集中的数据越大,报表的加载速度就越慢,特别是你放入了大量的KPI计算表达式计算在报表端,这个过程也非常的耗费时间。
所以通常的做法是:
1. 能在 SQL 查询完成的计算就在 SQL 查询端完成,即使这个过程比较长但是总比在报表前端通过页面表达式计算要效率更高一些。
2. 尽量控制和减少数据集的大小,返回量的大小,这样报表前端渲染的就更快一些。
3. 把 ReportServerTemp 数据库调整大一些,包括自动增长,因为大量的基于 Dataset 在报表端的汇总会在这个数据库中做聚合计算。
4. 包括 Group by 这种报表聚合表中不要通过表达式实现,而是直接取数据集中的字段列,宁愿这种计算列现在查询阶段做好。
5. 如果这种查询聚合仍然很慢,建议把这个数据集固化,即创建表先把所有计算好的数据、聚合的数据写到表中,然后这张表直接作为数据集的源,这样减少中间的计算环节。本身数据仓库的处理通常就是每天晚上执行的,完全可以把这部分的处理放到 JOB 中,先把数据计算好,报表直接引用而不是查询再聚合再计算。
6. 认真看看 ReportServer 数据库中的 ExecutionLogN (N 找最大的那个数字),里面有3个时间段分表表示查询、渲染、加载的时间,以及返回的数据量大小和条数。
通过我上面说的几个阶段的优化,你就能明显看到这几个时间段包括数据量条数的大小变化,报表的速度会明显提高。