Chinaunix首页 | 论坛 | 博客
  • 博客访问: 341804
  • 博文数量: 25
  • 博客积分: 3011
  • 博客等级: 中校
  • 技术积分: 367
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-28 13:22
个人简介

生命在于折腾

文章分类

全部博文(25)

文章存档

2015年(1)

2011年(3)

2010年(4)

2009年(17)

我的朋友

分类: 架构设计与优化

2011-05-22 15:15:04

大部分ABAPer都是从SAP报表及打印开始学起的,大家也都认为写个SAP报表程序是最简单不过的事了。

但是实际情况真的如此吗?写报表时除了保证数据的准确性,您可曾考虑过报表的性能问题吗?

由于报表程序是被最多SAP用户所访问的,所以性能差的报表很可能会引来大量的抱怨和质疑,大大降低用户满意度。

最近做了很多性能优化方面的工作,报表运行5~6分钟优化成10多秒的,运行1~2个小时优化成3~4分钟的,比比皆是。于是颇有感触,在此进行归纳总结,希望对大家有所帮助。

 

 

1,  关于表连接语句(INNER JOIN, LEFT JOIN...

 写报表的时候,表与表之间的关联是不可避免的。通常而言,表连接语句要掌握的原则有:

 

(1) 将最有效的查询条件所对应的表放在第一位。换言之,让查询第一个表后所得到的结果集就尽可能小。

比如有一张报表叫做订单状态统计表,可能查完VBAKVBAP后还查询LIPSVTTP等,界面上的查询条件很多。不过据了解得知,该报表主要是查看昨天创建或前几天创建的订单。那么最有效的限制条件自然是订单创建日期,以及销售组织了,而表连接的主表宜选用VBAK

 

(2) 确定了表连接的次序后,应考虑将查询条件尽量限制在靠前的表里。比如选择屏幕上有个物料号的查询条件,而我们知道订单VBAP和交货单LIPS均有物料号,那就应该视情况而定,如果表连接中VBAP更早出现,那么WHERE子句中就使用vbap~matnr IN s_matnr,反之就是lips~matnr IN s_matnr

 

(3) 两个表之间进行连接的时候,应考虑关键字段或索引字段的作用。比如查询VTTPLIPS时,关联关系是vttp~vbeln = lips~vbeln。那么vttp在前,lips在后,就会比较快,因为根据vttpvbeln查询lips时,vbelnlips的关键字段,速度较快。而反过来如果lips在前,那根据lips~vbeln查询vttp会慢一些,除非vbelnvttp的索引字段。

 

 

2,  先构建RANGE再执行SQL语句

有时我们所能用的查询条件不是很理想,比如查询LIKP却必须用公司代码,而非销售组织。

此时普通做法是用LIKPTVKO根据VKORG进行表联接,从而限制TVKO~BUKRS的值。

 

还有一种有效的办法是,通过TVKO查询到当期公司代码所对应的全部销售组织,从而组建一个RANGE出来,再根据此RANGE查询LIKP。当然要注意RANGE的行项目有上限的,在ECC6中大概2万行将导致ABAP DUMP

提示:DATA r_vkorg TYPE RANGE OF likp-vkorg.

SIGN = ‘I’, OPTION = ‘EQ’, LOW = ‘XXXX’ 即可往r_vkorg中放入多个单值。

 


3,使用COLLECT的注意事项

这里把COLLECT单独拎出来,并非排斥对它的使用。事实上COLLECT语句非常好用而且功能强大,却也因此往往被滥用。


COLLECT一般是在LOOP循环内被使用,进行汇总运算。对于每个COLLECT wa INTO it_sum语句,系统会先查找内表it_sum中是否存在相同属性的条目,如果存在则在此条目上对数值进行叠加;如果不存在则新增一个条目。所以,这里涉及了查找的过程,而且该查找动作是在LOOP内进行的,是不是有点类似于嵌套循环?不过,ABAP早考虑到此因素。查看帮助发现,原来此查找过程采用了哈希法,怪不得程序性能依然很好。

 

但是,笔者曾经碰到过一个很慢的报表,仅仅通过对COLLECT语句进行调整,即大大优化了其性能。这是因为该报表没有考虑到以下2点:

(1)it_sum中的非数值字段不应过多。上面说了,系统采用哈希法查找it_sum是否存在相同属性的条目。如果非数值字段过多,哈希法的性能将因运算量过大而急速下降。

(2)it_sum的最终条目数应该少点。如果条目数增长过快,则查找过程的速度可能将受影响,从而影响性能。比如COLLECT vbak-vkorg可能比COLLECT vbak-vbeln会快些,因为前者的重复性高,结果集的条目数少。


 


【待续】

 
 
阅读(6616) | 评论(4) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2011-06-20 17:50:28

很好的文章,谢谢

chinaunix网友2011-06-20 10:16:13

老大,期盼中,很支持你的观点

chinaunix网友2011-06-13 22:20:43

先顶一下,晓得是谁,好东西,收了

chinaunix网友2011-06-13 22:09:24

顶一下甘哥