大清单报表应当怎么做?

在数据查询时,有时会碰到数据量很大的清单报表。用户输入的查询条件很宽泛,可能会从数据库中查出几百上千万行甚至过亿的记录。如果等着把这些记录全部检索出来再生成报表呈现,那需要很长时间,用户体验恶劣;而且报表一般采用内存运算机制,大多数情况下也装不下这么多数据。所以,我们一般都是使用分页呈现的方式,尽量快速地呈现出第一页,然后可以随意翻页显示,每次只显示一页,也不会造成内存溢出。



那么,一般的报表工具或BI系统都是怎么实现这一机制的呢?

绝大多数产品都是使用数据库分页的方法来做的。

具体来讲,就是利用数据库提供的返回指定行号范围内记录的语法。界面端根据当前页号计算出行号范围(每页显示固定行数)作为参数拼入SQL中,数据库就会只返回当前页的记录,从而实现分页呈现的效果。

这样做,会有两个问题:

1. 翻页时效率较差

用这种办法呈现出第一页来一般都会比较快,但如果向后翻页时,这个原始取数的SQL会被再次执行,并且将前面页涉及的记录跳过。有些数据库没有OFFSET关键字,就只能由界面端自行跳过这些数据(取出后丢弃),像ORACLE还需要用子查询产生一个序号才能再用序号做过滤,这些动作都会浪费时间,前几页还感觉不明显,但如果翻到的页号比较大时,就会有等待感了。

2. 可能出现数据不一致

一般来说,每次按页取数时发出的SQL是独立的。这样,如果在两页取数之间数据库又有了插入删除动作,这时取出来的数据将是最新的,很可能和原来的页号匹配不上了。比如第1页取出20行记录后,在取第2页前,第1页的20行记录中被删除了1行,那么这时候取出来的第2页的第1行就会是原来的第22行记录,原来的第21行会落到第1页去了,要再倒翻页才能看到。如果基于这些数据做汇总统计,那会出现错误的结果。



还有一种不常用的方法。向数据库发出取数SQL生成游标,从中取出一页后呈现,但并不终止这个游标,要取下一页的时候再继续取数。这种方法能克服上述两个问题,不会发生不一致的现象,但绝大多数的数据库游标只能向后取数而不是倒回去,这样在界面上的表现就是只能向后翻页了,这一点很难向业务用户解释,所以很少用这种办法。

也可以是两种办法的结合,向后翻页时用后一种办法,一旦发生向前翻页时,则重新执行取数SQL。这样比每次分页取数的体验略好一些,但并没有根本上解决问题。



还有什么好办法呢?

把取数和呈现做现两个异步线程,取数线程发出SQL后就不断取出数据后缓存到本地存储中,呈现线程根据页数计算出行数到本地缓存中去获取数据显示。这样,只要已经取过的数据就能快速呈现,不会有等待感,还没取到的数据需要等待一下也是正常可理解的;而取数线程只涉及一句SQL,在数据库中是同一个事务,也不会有不一致的问题。这样,两个问题都能得到解决。不过这需要设计一种可以按行号随机访问记录的存储格式,不然要靠遍历把记录数出来,那反应仍然会很迟钝。

在当前数据库系统不直接支持这种机制时,只能是报表工具或BI系统受累自己写这些程序了,对于有大清单报表呈现需求的用户,就要认真考察这些功能点了。

原文地址:http://blog.51cto.com/12749034/2124898

时间: 2024-10-29 19:08:34

大清单报表应当怎么做?的相关文章

大清单报表的打印?

我们谈了大清单报表的呈现方法,其实有时候这些报表还需要打印,比如银行打印流水对账单. 那么,打印是不是也要像呈现那样做一个缓存机制呢? 没有这个必要.打印和浏览不同,一般是从头到尾过一遍就行了,过程中没有翻页的需求.这样,只要流式读入数据逐步生成打印页就可以了,不会发生内存溢出的问题. 但这个做法仍然比较麻烦,特别是现代浏览器加强了安全控制,applet等插件经常被禁用,打印功能常常不能直接由报表工具提供,而要采用flash或PDF方式来实现.用flash可以做到流式读取,但并不简单,还会导致插

图说可视化,报表也能做得如此酷炫!

1.数据可视化概述 1.1.数据可视化的作用 数据可视化是指将数据通过图表的方式传递出来,让用户能够快速.准确地理解信息所要表达的内容,从而提高沟通效率.数据可视化的作用主要有: 1)传递更多的信息,一张图能够传递的信息可能需要长篇大论才能写清楚,如你要描述最近一年公司收入情况,那你就需要说明每个月收入是多少,同比.环比增幅是多少,收入最多.最少的是哪个月,同比.环比增幅最低.最高的是哪个月等,而你用图表表示则只需要一个柱状图和折线图的组合图表,就能准确表达上面的信息. 2)形象生动,便于理解,

在知识的星辰大海中,我愿做一个渔夫

这篇文章来自于我最近刚创建的微信公众号:星辰渔夫,欢迎大家订阅!关注回复「星辰大海」,你懂的. 在知识的星辰大海中,我愿做一个渔夫.这是该公众号的初衷,也是目标.本篇算是一个开场白,就来说说这初衷,也为自己定个目标. 庄子说过:吾生也有涯,而知也无涯 .说人的生命是有限的,而知识是无限的,有人说这句话是鼓励大家要好好学习.也有人说其实这话还有后半句:以有涯随无涯,殆已!用有限的生命去追求无限的知识,那你就玩完了. 印象最深的自然是那句:Stay hungry, stay foolish! 告诉我

大数据集报表点击表头排序

在润乾官方在线 demo的 "交互报表" 中,有介绍 "点击表头排序" 的报表案例,该报表针对普通统计类报表.对于使用大数据集的报表,当按照此方式改造时发现排序没起作用或仅对第一页或前几页排序,后面的都没成功. 要想了解啥原因导致?就需要分析该报表的做法及知道大数据集的取数原理. 首先,来分析下在线 demo“点击报表排序”的做法. 润乾报表中实现排序的方式有两种: 1. 借助数据集 sql,即 order by … 2. 数据集函数 如ds.select() 都有

葡萄城报表之分栏报表-物品清单报表实现

提起分栏报表,它的数据组织形式就如同小时候使用的数学作业本一样,将数据分为多栏显示,当然写作业时有的人习惯横向写,有的人则喜欢竖着写完,在写另一栏.所有的电子技术都是采用隐喻的手法,从物理世界而来,分栏报表也是源于生活,分栏报表也可以行分栏(竖向分栏)和列分栏(横向分栏). 分栏数可以分为两栏或多栏. 行分栏数据流从上往下的方向显示数据,超过固定的行数就另起一栏显示,列分栏的数据的流向是从左往右,超过固定的列数就另起一栏显示.在商业报表系统中常见的分栏报表有商品标签.员工工卡.条码打印等.由此可

分栏报表-物品清单报表实现

提起分栏报表,它的数据组织形式就如同小时候使用的数学作业本一样,将数据分为多栏显示,当然写作业时有的人习惯横向写,有的人则喜欢竖着写完,在写另一栏.所有的电子技术都是采用隐喻的手法,从物理世界而来,分栏报表也是源于生活,分栏报表也可以行分栏(竖向分栏)和列分栏(横向分栏).分栏数可以分为两栏或多栏.行分栏数据流从上往下的方向显示数据,超过固定的行数就另起一栏显示,列分栏的数据的流向是从左往右,超过固定的列数就另起一栏显示. 在商业报表系统中常见的分栏报表有商品标签.员工工卡.条码打印等.由此可见

报表工具怎么做模糊查询

在数据查询系统中,我们常常会遇到精准查询和模糊查询.我们知道,对于关系数据库,使用精准查询可以直接在 sql 里面使用"where 字段 = 参数值"来过滤对应的数据,而要实现模糊查询,我们使用的就是 like 的形式.那么,在报表里面该如何使用 like 方式实现模糊查询来过滤数据呢? 下面,我们结合润乾报表自带的 hsql 数据库中的客户表,来做一个模糊查询的示例. 例如:在下拉框中通过模糊查询显示所有姓名里面带有"王"字的联系人,当用户选择后进行精准查询.并且

转载:中国大变革,你该怎么做?

来源:占豪 昨天那篇以移动运营商为例谈国企的文章,很多人发来私信,有国企内部工作人员,也有普通公众.大部分人能从文章中找到了共鸣,受到了启发,也有人产生误解,还有人明显对未来持抱残守缺的态度.个人觉得有必要稍作补充以避免情绪左右理性思考. 有的消费者战友认为,国企垄断.得到了超额利润,他们对国企运营商很反感.对这种态度,个人想说的是,包括中国移动.中国联通.中国电信这些运营商,过去很多年都为我国信息产业发展做出了卓越贡献.正是他们过去些年积极投资,努力进取,才有了发展速度远超很多国家的中国互联网

李大维:互联网人做硬件创业容易产生的七大误解【转载】

原文地址 我在第一篇分享了为什么我认为现在是互联网人去做硬件创业的好时机,但是我们也看到不少互联网背景的同学真的来做硬件的时候,遇到了很多自己没有想到的问题.在我看来,很多问题其实是源于互联网人没有把"自己应该做什么"这件事情想清楚,结果做失败了之后,又对这件事产生了错误的理解,回到互联网领域去传播了这些误解. 今天我希望能够从我的角度跟大家分享为什么我们会产生这些误解,以及我们应该怎样做. 本文也是 InfoQ 中文站<给软件人讲硬件>系列访谈的第二篇. 误解之一:做硬件