广告
返回顶部
首页 > 资讯 > 数据库 >大清单报表应当怎么做?
  • 309
分享到

大清单报表应当怎么做?

2024-04-02 19:04:59 309人浏览 独家记忆
摘要

在数据查询时,有时会碰到数据量很大的清单报表。用户输入的查询条件很宽泛,可能会从数据库中查出几百上千万行甚至过亿的记录。如果等着把这些记录全部检索出来再生成报表呈现,那需要很长时间,用户体验恶劣;而且报表一

大清单报表应当怎么做?

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


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

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

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

这样做,会有两个问题:

1. 翻页时效率较差

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

2. 可能出现数据不一致

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


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

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


还有什么好办法呢?

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

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


您可能感兴趣的文档:

--结束END--

本文标题: 大清单报表应当怎么做?

本文链接: https://www.lsjlt.com/news/35876.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 大清单报表应当怎么做?
    在数据查询时,有时会碰到数据量很大的清单报表。用户输入的查询条件很宽泛,可能会从数据库中查出几百上千万行甚至过亿的记录。如果等着把这些记录全部检索出来再生成报表呈现,那需要很长时间,用户体验恶劣;而且报表一...
    99+
    2022-10-18
  • 报表连 MongoDB,数据量大报表慢,怎么做分页?
    MongoDB 没有关系数据库之类的分页机制,要实现分页查询得硬编码,可以通过实现 Pageable 接口来自定义分页类,具体网上有很多介绍。 硬编码的缺点是实现太复杂了,也不好维护,对报表开发人员的要求有点高。简单一点的方式是使用支持 ...
    99+
    2022-01-23
    报表连 MongoDB,数据量大报表慢,怎么做分页?
  • 大数据报表怎么做模糊查询
    这篇文章的内容主要围绕大数据报表怎么做模糊查询进行讲述,文章内容清晰易懂,条理清晰,非常适合新手学习,值得大家去阅读。感兴趣的朋友可以跟随小编一起阅读吧。希望大家通过这篇文章有所收获!在数据查询系统中,我们常常会遇到精准查询和模糊查询。我们...
    99+
    2023-06-04
  • MongoDB数据量大报表慢该怎么办以及怎么做分页?
    MongoDB数据量大报表慢该怎么办以及怎么做分页?,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。MongoDB 没有关系数据库之类的分页...
    99+
    2022-10-18
  • 怎么让Birt报表脚本数据源变得既简单又强大
    这篇文章将为大家详细讲解有关怎么让Birt报表脚本数据源变得既简单又强大,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。概述:运行在 JVM 上的 SQL 函数和存储过程总...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作