reportview 加载报表

ff_1211 2011-06-21 11:30:03

我的报表是rdlc格式,用reportview加载 ,很慢,有哪些原因。怎么提升这速度??

数据库记录6万条,查询所有。 直接在sqlserver中耗时很短 2秒 ,可在网页中用reportview加载,达到1分钟以上

求助各位!
...全文
233 点赞 收藏 11
写回复
11 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
阿泰 2011-06-22
1:从理论上讲,手工分页会比自动分页慢些。
所以我建议你这样试试:再优化这个SQL语句,尽量到毫秒级。另外就是尽量减少RDLC报表上面的再处理
比如根据条件加底色加粗等等,减少自定义函数等各种自定义的环节,不用手工分页,使用自动分页。
再看看。
另外,他说的是50W条返回结果还是50W数据表里的结果呢,这个差别很大。

2:我们项目用的是水晶报表,所以对RDLC报表的话,我大数据量上的经验并不丰富。
水晶报表在处理清单类报表上有比较好的优势,但是有个很大的劣势就是导出性能差
基表数据是亿级(还没上10亿)。
但是如果超过50W我们基本上不允许显示。这样的数据页面展现、导出基本上没有任何意义
因为你不可能去从这么浩瀚的数据里去直接发现什么。
只有打印、或者是导出到Excel(或导入其他业务接口)里做二次分析。
前者的打印因为是要耗费大量的物理资源(长时间占用打印机以及耗费打印资源)后者要占用大量的服务器资源
所以我们一般会把这个作为一个单独的业务需求来处理的,也就是他们会提一个数据接口申请。我们会返回一个数据库表的导出文件给他。

50W在呈现上大概在20秒内,但是在页面上导出的话大概要30分钟(水晶报表的劣势)。
如果客户需要大数据范围的数据,我们会用SQL直接在数据库上出一个给他。

现在我们在架构一个新的平台,来将这个手工动作自动化。
但是,最终如果数据达到10w级(根据用户的权限级别设定)
我们一般是在后台调度,调度完后给他一个通知(短信或邮件),然后他再上来后就可以下载生成的数据接口文件,而不是在报表上直接展示。

我们主要做的是业务系统,跟一般的WEB不大一样,所以可能参考性比较不强。呵呵。

我建议你先按1试试。。
回复
ff_1211 2011-06-22
[Quote=引用 5 楼 babyt 的回复:]
不管界面上怎么处理,只要是取了大的数据全集,那么效率肯定会慢的。
SQL Server的2s只是纯取数据,RDLC拿到数据后,还要进行页面渲染,分页等等系列操作。
所以慢是正常的。

思路是这样的:

因为这么大的数据量一般是清单显示,所以界面相对单一。
这个首先对数据进行一次Count,返回到程序里,然后根据这个总数分页,把页码作为参数传递给报表
(第几页,共几页都可以算出来)
……
[/Quote]

阿泰 你好

我有几点疑问:

1.昨天也是一个做报表的朋友告诉我,他50W的数据,用reportview显示,耗时才不过几秒钟;并且用的是reportview自带的分页,并没有手动分页,没有修改工具栏;跟他的比起来我的数据量几乎是微乎其微,但是速度是慢的惊人,这如何解释呢?
2.你们做报表的数据量应该至少也是万条为单位吧;你们测试的速度大概在一个什么范围内,如果耗时比较长又是如何处理这个问题呢?是不是就像你刚才给我的建议这样处理的?
3 如果你们采取的是手动分页,手动修改工具栏这个解决方案,那么可不可以给个小例子给我参考参考呢?
回复
阿泰 2011-06-22
不管界面上怎么处理,只要是取了大的数据全集,那么效率肯定会慢的。
SQL Server的2s只是纯取数据,RDLC拿到数据后,还要进行页面渲染,分页等等系列操作。
所以慢是正常的。

思路是这样的:

因为这么大的数据量一般是清单显示,所以界面相对单一。
这个首先对数据进行一次Count,返回到程序里,然后根据这个总数分页,把页码作为参数传递给报表
(第几页,共几页都可以算出来)
然后用用分页存储过程,每次返回一页的数据给RDLC。这样组合成一个页。

但是要注意的是,这样的话,工具条就要自己改造了。
比如翻页动作,导出、打印动作。这样的话,工作量就巨大了。
回复
阿泰 2011-06-22
囧~~

非常感谢ff_1211能分享问题的原因和解决方法 :)
回复
ff_1211 2011-06-22

阿泰你好:

我现在终于知道我的报表为什么如此慢了,

最重要的原因在于:我在报表结果呈现之前,将报表导成了excel文件于服务器上。此步骤耗时比较多。

这步骤是为了实现我程序中,另一功能,写了很久了,都忘记做了这一操作。。哎。
之前因数据量小,没有很明显的看出效率问题

最后,非常感谢你的帮助
回复
阿泰 2011-06-22
[Quote=引用 8 楼 ff_1211 的回复:]

恩,首先谢谢你的回答!

我按照你给的建议1先测试测试。

不过你在第一回答的时候,提供的思路就是指的手动分页吧!怎么从理论上又说这样速度会比自动分页慢呢?
或者说是我理解错误,你指的并不是手动分页,而是其他说法?
[/Quote]

自动分页一般是报表按照设定的页面(或纸张)大小进行的,
而手工分页可能有很多情况,你可能简单指定一个每页行数,也可能有其他条件的依赖等等。
我的总体意思是,在数据量很大的时候,尽可能少地在报表上做一些设定动作。
回复
ff_1211 2011-06-22
恩,首先谢谢你的回答!

我按照你给的建议1先测试测试。

不过你在第一回答的时候,提供的思路就是指的手动分页吧!怎么从理论上又说这样速度会比自动分页慢呢?
或者说是我理解错误,你指的并不是手动分页,而是其他说法?
回复
chenhaoying 2011-06-21
网页加载的内容达到10M的话速度就变得很慢很慢了,6w条数据建议分页显示,不要一下子显示。
回复
ff_1211 2011-06-21
[Quote=引用 3 楼 wxr0323 的回复:]
设置组属性

1. 工具箱中拖一个列表过来,设置 列表-->行组-->组属性
常规-->组表达式=Int((RowNumber(Nothing)-1)/10)
分页符-->勾选在组的结尾
2. 工具箱中拖一个表,放在列表中,然后可以对表进行随意设计,表中分组就会自动按照10条一页进行分页,标题也会在新页中被重复打印了

3.公式:=Sum(Fields!数量.Value) 这样的格式……
[/Quote]

这样处理后,页面同样是显示很慢。。这种处理应该也是全部读取数据,然后再对结果分页,显示几条记录吧
回复
子夜__ 2011-06-21
设置组属性

1. 工具箱中拖一个列表过来,设置 列表-->行组-->组属性
常规-->组表达式=Int((RowNumber(Nothing)-1)/10)
分页符-->勾选在组的结尾
2. 工具箱中拖一个表,放在列表中,然后可以对表进行随意设计,表中分组就会自动按照10条一页进行分页,标题也会在新页中被重复打印了

3.公式:=Sum(Fields!数量.Value) 这样的格式在分组中,就是求组小计,
在不是分组的情况下,就是合计。
4.而自动生成的语句是用的:=Sum(Fields!数量.Value, "DataSet_Name")
这条是自动生成的无论有没有分组的情况下,都是所有记录的合计

参考
回复
ff_1211 2011-06-21
[Quote=引用 1 楼 chenhaoying 的回复:]
网页加载的内容达到10M的话速度就变得很慢很慢了,6w条数据建议分页显示,不要一下子显示。
[/Quote]

自定义分页显示,是不是就和平常自定义gridview分页一样?
回复
相关推荐
发帖
图表区
创建于2007-09-28

4810

社区成员

.NET技术 图表区
申请成为版主
帖子事件
创建了帖子
2011-06-21 11:30
社区公告
暂无公告