如何优化SSRS报表的打开速度?

0
1.现状:目前有张报表打开的速度在40秒左右,效率太慢
2.原因:报表指标多,还要计算环比,取的数据库字段多,并且层级多、粒度细、数据量相对多因此加载速度慢。
3.优化方案:我们用的是MySQL数据库,将MySQL导入到sqlserver中,所有指标都是从一个数据集中取,将大表拆分3个表,建3个数据集,直接从拆分的表中取,拆分的3张表每个维度添加索引。
4.结果:优化之前40s,优化之后10s,工作量却是之前的1.5倍。采用大表拆分方案可以一定程度解决报表打开效率,但随之的工作量和维护量会增加,数据库的表也会成倍增加,长此以往会数据架构会越来越累赘。
5.疑问:有没有其他方案能对报表效率提升,网上说可以分区。另外MySQL是否适用OLAP处理,需要换数据库吗?SSRS本身有缓存或者优化之类的吗?
报表_看图王.png sql2.png
已邀请:
7

BIWORK - 热衷于微软BI技术,技术架构和解决方案! 2015-09-07 回答

优化报表速度可以从这几个方面入手:
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个时间段分表表示查询、渲染、加载的时间,以及返回的数据量大小和条数。

通过我上面说的几个阶段的优化,你就能明显看到这几个时间段包括数据量条数的大小变化,报表的速度会明显提高。
 
3

天善_小龙 2015-09-07 回答

对于SSRS报表层面的性能优化,我觉得可以考虑下面几点: 
1. SQL优化,这些优化方法需要结合你的实际进行,什么方法,你可以网上找找。
2. Report Server服务器,内存资源等提升。报表的处理和呈现操作会占用大量内存
3. SSRS报表层面运行慢,主要有3块:数据检索时间,报表数据处理时间,报表呈现时间。你可以查看下,哪个时间占用的最多: 
Use ReportServer
select * from ExecutionLog3 order by TimeStart DESC
4. 如果单个报表的处理速度慢,可以考虑做report snapshot, report cache: 
https://www.mssqltips.com/sqlservertip/1922/working-with-report-snapshots-in-sql-server-reporting-services-ssrs/

https://msdn.microsoft.com/en-us/library/bb522786.aspx  
以上链接资料可以供参考。   
 
另外,如果涉及到很多aggregate的计算,如果能在SQL层面做的,就在sql层面处理。不要在report层面做.
0

- 取是能力,舍是境界 2015-09-07 回答

1、数据集SQL本身的查询较慢,建议继续优化
2、没有看明白你的环比是如何计算出来的,数据量大的话建议在查询层面计算,数据量小可以提取到报表层面
3、指标多,如果指标中重用字段多建议计算放在报表层面
4、层级多,SSRS很容易解决层级问题
5、数据量太大,可以做主子报表的查询,实在太大还是上数据仓库用MDX来查询吧
6、如果有多表关联导致查询慢,可以尝试多数据集,在报表层面关联
0

天桥下的郑成功 - Hadoop大数据开发工程师、数仓架构师、熟悉数据仓库设计、Hadoop、Spark、HBase、Hive、SSIS等开发 2015-09-07 回答

你现在这个查询是在MYSQL里面做,还是SQL里做 然后给RS
如果是SQLServer, 试着在你的查询最后加上 OPTION (RECOMPILE)

要回复问题请先登录注册