如何更高效的进行数据的聚合-ABAP报表数据处理方法的思考

我们在报表的开发过程中,经常会遇到关于数据聚合的相关需求。这个类型的报表,虽然取数逻辑和运算逻辑并不复杂,但是由于需要在系统主数据表中读取大量的历史数据,对于系统数据库和网络传输的压力都非常大,如果程序逻辑不合理,即使报表取的的数据是正确的,随着数据量的增加,系统的速度和报表的运行速度都会越来越慢,可能会出现用一整天的时间跑一个报表的事情。这就要求我们用最合理最科学的方式编写程序,进行数据的读取,数据的处理,避免以上的种种情况.

一.根据用户输入的信息筛选查询所关联的数据库表。

在一般的报表需求中,出于希望获得更精确的信息的考虑,用户会要求尽量多的输入选项。用户要求的检索条件越多,报表程序需要关联查询的数据库表就越多。

面对这种需求,作为程序编写者有两个选择。一是用尽量少的SQL语句实现尽可能的查询功能,实现的方法包括在WHERE语句中嵌套SELECT子查询,INNER JOINOUT LEFT JOIN。这样的好处是可以让程序代码更加简练,降低程序逻辑的复杂度。第二种选择是尽量根据用户的输入查询条件,在本地进行逻辑的处理,然后把经过筛选SQL查询语句传送到数据库。用户输入的查询条件,我们可以在本地先行排除,不必交给数据库去进行复杂的操作。这种方法可以有效降低数据库的压力,只是本地代码的复杂度会有一定程度的增加。

ABAP语言本身,也考虑到了防止数据库的压力过大,限制OUT LEFT JOIN的表的数目不能超过两个,而对于冗余数据较少的INNER JOIN的表的数目没有限制,但是也不建议INNER JOIN过多的表。

所以在程序的编写过程中,我们应尽量对用户的输入条件进行筛选,只去读取用户输入的相关表,降低数据库的运算压力。

 

二.尽量使用INNER TABLE替代OUTER TEALE

有一些报表,跨几个模块的查询,是必须用到2个以上的主数据表的,即使我们按照上面所说,根据用户的查询条件作了筛选,也很难避免同时对几个主数据表进行数据的读取。2个以上10万条记录等级的主数据表的JOIN查询是对系统的折磨,我们无法预见会对给系统带来多大的压力,应该尽量减少。遇到这种情况,我们可以尽量多的使用ABAP提供INNER TABLE,把数据库表中符合条件的数据传输到本地,进行处理之后在根据结果去检索其他的数据库表。这样虽然也同样会使本地代码变得复杂,还会对网络传输带来不小的压力,但是对比于把复杂的SQL语句全部交给数据库去运行,无疑更加明智。

三.降低对数据库的频繁读写。

一次的超大数据量的查询会给数据库系统带来很大的压力,非常频繁的小数据量的读写同样会给系统带来灾难性的后果。在SAP系统的OPEN SQL中有两种查询方式,一种是使用SELECT INTOENDSELECT关键字。运行SELECT INTO的时候从数据库中取得一条数据,然后可以通过ABAP代码进行数据的处理,之后用ENDSELECT语句结束,再返回SELECT INTO,读取下一条数据。另一种方法是使用SELECT INTO CORRESPONDING FIELDS OF TABLE关键字,只对数据库进行一次读写,把符合要求的数据全部传输到本地表。结束查询后在另外对本地表进行数据的操作。很明显,数据量很大的情况下,一条一条的反复读取,会给数据库带来很大的负担,我们最好使用第二种方法,尽量一次性的把数据读取到本地。

写程序,不应简单的以实现用户要求的功能为目标,程序的兼容性,健壮性,冗余性,可扩展性,可重用性等等,都是很重要的。落实到这次的题目,就是应该用最好的编程逻辑,降低对数据库系统的压力。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值