`
s103y
  • 浏览: 116215 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

ABAP:SAP报表性能的优化

    博客分类:
  • SAP
阅读更多
原文地址:http://blog.chinaunix.net/space.php?uid=150062&do=blog&id=2780088

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

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

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

最近做了较多性能优化方面的工作,颇有感触,在此进行归纳总结,希望对大家有所帮助,也欢迎大家讨论。





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



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



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

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



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



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





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



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

此时普通做法是用LIKP与TVKO根据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,  For All Entries与Select Single的比较

就个人而言,笔者不是很喜欢For All Entries语句,因为它的缺点多于优点。很多人都会说,为什么呀,For All Entries不是比Select Single快么?事实到底怎样呢,让我们做个比较。

假设我们有个内表代表销售订单的行项目,该内表有10万行。此时我们要根据LIPS的VGBEL和VGPOS,查询这些订单行项目对应的交货单行项目。



如果用SELECT SINGLE的话写法很简单:

LOOP AT it_vbap INTO wa_vbap.

SELECT SINGLE vbeln posnr

FROM lips INTO (wa_vbap-vbeln_vl, wa_vbap-posnr_vl)

WHERE vgbel = wa_vbap-vbeln AND

vgpos = wa_vbap-posnr AND

vgtyp = ‘C’.

  MODIFY it_vbap FROM wa_vbap.

ENDLOOP.



如果用For All Entries则写法分2步:

SELECT vbeln posnr

FROM lips INTO TABLE it_lips

For All Entries IN it_vbap

WHERE vgbel = it_vbap-vbeln AND

vgpos = it_vbap-posnr AND

vgtyp = ‘C’. “此交货单是根据订单创建的



LOOP AT it_vbap INTO wa_vbap.

READ TABLE it_lips INTO wa_lips WITH KEY vgbel = wa_vbap-vbeln

vgpos = wa_vbap-vgpos.

IF sy-subrc = 0.

  wa_vbap-vbeln_vl = wa_lips-vbeln.

  wa_vbap-posnr_vl = wa_lips-posnr.

  MODIFY it_vbap FROM wa_vbap.

ENDIF.

ENDLOOP.



对于SELECT SINGLE而言,由于LIPS有个VGB的SAP自带索引,每次查询都挺快,即便循环10万次,速度虽然快不了但也没什么大的危害。

对于For All Entries的第一步,的确比SELECT SINGLE快些,本来10万次的SELECT SINGLE,变成了1万次的查询(如果BASIS设置了参数为10),每次查询10个订单行项目。但是第二步就很慢了, 暂估it_lips为8万行,则对于it_vbap的10万个行项目,有8万个行项目执行READ TABLE语句平均需要4万次才能搜索到it_lips的目标行,另有2万个行项目将读遍it_lips然后才发现没有对应的目标行。所以我们一共需要搜索48亿次,太慢了!



在此针对For All Entries的使用提出几点意见:

(1)如果是根据某数据量大的内表用For All Entries读取数据量小的配置表,比如TVAK/T006等,那不如把For All Entries直接去掉,把表里的几十条数据全部取出。

(2)使用For All Entries时,SELECT语句后面的字段必须包含所查表关键字段。比如上面的vbeln/posnr就是lips的关键字段。如果不含关键字段,比如SELECT lfimg FROM lips For All Entries ***,那么当LIPS中两个条目关键字段不同而lfimg相同时,会被SAP自动过滤掉一条。

(3)上面关于性能问题,应该利用BINARY SEARCH、SORTED TABLE或者HASHED TABLE来解决。详见下面第四节。





4,  关于BINARY SEARCH/SORTED TABLE/HASHED TABLE的使用



BINARY SEARCH即二分法查找,在保证内表按查询字段以升序排列的时候,可以采用二分法查找。二分法查找的速度很快,最大查询次数为log2n。以上面的例子来说,如果it_lips事先按vgbel和vgpos排好序,则每次查找最多不超过17次。则对于it_vbap的10万个行项目,仅100多万次就可以搞定了!

当使用READ TABLE语法时,如果查询字段跟SORTED TABLE的排序开始字段能匹配上,则SAP将自动采用二分法查找。比如it_lips是SORTED TABLE且以vgbel和vgpos排序,则当read table以vgbel进行查找时,系统会自动采用二分法。但如果read table以vgpos和其他字段进行查找,由于vgpos并非SORTED TABLE的第一排序字段,系统将采用直线查找,速度会慢很多。总之,SORTED TABLE的排序字段次序也很关键。



针对STANDARD TABLE排序后可以进行二分法查找,使用SORTED TABLE也可进行二分法查找,那么二者有什么区别呢?简单来说,由于SORTED TABLE自始至终都保持排序,如果需要对内部进行频繁的插入、删除操作,则不推荐使用SORTED TABLE,性能会很差。而另一方面,如果我们要用的是类似LOOP AT it_lips WHERE vgbel = ** 的语法(而非READ TABLE)时,对于STANDARD TABLE就无法采用二分法查找,或者说会很麻烦。而对于SORTED TABLE,系统会自动采用二分法优化查找过程。



至于HASHED TABLE,笔者用得也不太多。查看SAP的标准代码,貌似用得也没很多。理论上HASHED TABLE可以比SORTED TABLE更快些,但需要耗用更大的存储空间。当某程序采用了二分法查找之后,如果效果还不是很理想,建议可以用HASHED TABLE试试。

5,  将循环内的重复性工作进行缓冲



有时我们的内表数据量很大,但又不得不在每次循环的时候,都进行类似的一些操作,比如调用函数FI_PERIOD_DETERMINE获取某日期对应的会计年度和期间,调用函数MD_CONVERT_MATERIAL_UNIT进行单位转换,等等。每个函数的调用背后都要执行一系列的读表以及运算工作,程序的效率明显下降了。所以我们得想出有效的办法。



比如针对FI_PERIOD_DETERMINE的调用,可以改用循环前对函数G_PERIODS_OF_YEAR_GET的调用。根据公司代码BUKRS读取T001-PERIV,然后调用G_PERIODS_OF_YEAR_GET获取某会计年度每个会计期间对应的起始日期和结束日期。这样在循环内部,只要根据上面的结果即可算出某日期对应的会计年度和期间了。



又比如针对MD_CONVERT_MATERIAL_UNIT的调用。相信对于it_vbap的10万个行项目,物料号重复的有很多。所以可以先汇总物料号,然后一次性读取表MARM以存储换算关系。有了MARM的换算关系,循环中大量的单位换算就可以自己算了,如果无法换算的再考虑调用函数MD_CONVERT_MATERIAL_UNIT。(函数MD_CONVERT_MATERIAL_UNIT除了读取MARM的换算关系,还会考虑同一维度单位间的换算关系比如G和KG的关系,所以其功能更强大。)





6,  关于字段的增强以及TABLE INDEX的创建



这里提到字段的增强,主要是性能方面相关的。假设我们需要基于系统所有的billing document做个动作,比如将其导出到金税系统。至少有两种方案:第一是新建一个表,专门记录已经导出到金税的开票凭证;第二是在系统标准的开票凭证抬头表vbrk中新增一个字段,记录是否已导出到金税。

用户在处理业务的时候肯定会反复查询“未导出到金税”的所有开票凭证。那么第一种方案下,我们需要先查询VBRK表(比如得到1万条记录),然后针对自建表的记录(比如得到9800条记录)做个减法,最后得到200条记录的结果集。而第二种方案就快多了,查询VBRK的时候判断新字段=“未导出”即可。

随着业务的持续,VBRK表的条目将越来越多,而“未导出”的条目则会维持在一个较为平稳的数字上,为了有效区分历史数据和现用数据,可添加TABLE INDEX,提高报表的查询速度。很多SAP标准表都自带了一些索引,这些索引大都比较实用。



创建索引需要注意以下几点:

(1)索引会占用额外的数据库空间,还会降低插入/修改的速度(虽然可提高查询速度),所以需要考虑实用性,肯定不是越多越好。如果表中已有类似的索引,则不推荐新建。而对于容量大的、被多个程序访问的表加索引就更要谨慎了,比如VBFA、MSEG、FAGLFLEXA、LIPS、VBAP、EDIDC、STXH等等。

(2)创建索引时应注意字段的先后次序,MANDT是必须的而且都要放在第一位。字段的先后次序取决于实际业务需要。另外索引的字段不宜太多,字段越多占用的数据库空间就越多,对于插入/修改的影响也更大。





7,  选用一些替代表/替代字段(VBFA, SHP_IDX_)

曾做过一些类似于“未拣配交货单”、“未发货过账交货单”的报表,刚开始用的是LIKP、VBUK等表,速度并不理想。后来调试了标准程序VL06O,发现其用的表是SHP_IDX_PICK、SHP_IDX_GDSI等。原来系统在创建交货单的时候,也会更新这些临时表。当拣配完成,该条目就从SHP_IDX_PICK中删除。所以表SHP_IDX_PICK的条目数始终不多,查询速度很快。

同样的,当我们在多个表中进行查询时,可能不同的限制条件都能达到同样的结果集,但效率差异就很大,所以选用有效的字段非常关键。比如需要查询某销售组织某天已发货的销售订单,我们可以将VBAP与LIPS联查。此时查询条件VBAK-LIFSK=SPACE或VBAP-ABGRU=SPACE并不影响查询结果,但它们可以在第一时间就排除大量无关的订单,对于性能的提升帮助很大。





8,考虑企业的特点及数据量状况



做优化不是简单的技术活,既要考虑报表的实际需求,也要考虑企业的业务状况。比如采用零售模式的企业客户量很大(KNA1表条目多),批发模式的企业客户量较小;食品饮料行业的物料号一般不多,而机械行业的物料号则往往多而繁杂;零售业的订单量很大、时间性很强,所以最有效的查询条件往往就是组织编码+日期,部分行业则可能订单量小但价值高。只有充分考虑到企业的业务特点,才能更有效地提高报表性能。
分享到:
评论

相关推荐

    MRP软件:SAP MRP二次开发-ABAP编程基础.docxMRP软件:SAP MRP二次开发-SAPMRP二次开发工具与技

    MRP软件:SAP MRP二次开发_SAPMRP性能优化与调试.docx MRP软件:SAP MRP二次开发_SAPMRP接口开发与数据集成.docx MRP软件:SAP MRP二次开发_SAPMRP最佳实践与行业应用.docx MRP软件:SAP MRP二次开发_SAPMRP概述....

    包装材料管理软件:SAP二次开发-SAP二次开发工具与环境配置.docx包装材料管理软件:SAP二次开发-SAP二次开发的基本

    包装材料管理软件:SAP二次开发_SAP包装材料管理的性能优化与维护.docx 包装材料管理软件:SAP二次开发_SAP包装材料管理的报表与查询开发.docx 包装材料管理软件:SAP二次开发_SAP包装材料管理的数据模型与结构.docx...

    SAP ABAP程序性能调优介绍.pptx

    SAP ABAP 程序性能调优是指通过对程序的优化来提高 SAP 系统的性能。性能调优是 SAP 系统管理员和开发人员的重要任务之一,因为它可以直接影响到用户的体验和业务的效率。 用户交互过程是 SAP 系统的核心部分,包括...

    报表监控V1.zip_ABAP实战_SAP

    5. 实战技巧:在实际项目中,ABAP开发人员可能需要处理大数据量、性能优化、动态查询等问题。例如,使用Open SQL和Internal Tables进行数据处理,利用ABAP缓存提升性能,或者运用ABAP CDS视图来简化数据访问。 6. ...

    abap性能优化

    本资料集主要探讨了ABAP性能优化的策略和技巧,适用于具有中等ABAP技能水平的开发者,以提升他们的代码效率,特别是在面对大数据量时,解决报表运行速度缓慢的问题。 1. **避免无谓的数据库访问**:数据库查询是...

    SAP ABAP 电子书

    此外,这本书可能还会涉及ABAP与数据库交互的技巧,如SQL语句的使用,以及如何进行单元测试和性能优化。 《实战SAP程序开发-从实例学ABAP编程》作为一本实践导向的书籍,很可能通过实际项目案例,教授读者如何解决...

    SAP ABAP ALV分页显示

    ### SAP ABAP ALV 分页显示技术解析 #### 核心知识点:SAP ABAP ALV 分页显示 本篇文章将深入分析一个基于SAP ABAP的ALV(Application List Viewer)分页显示的实现方法。ALV是SAP GUI中用于展示表格数据的一种...

    ERP信息化专业资料:SAP专业学习资料SAPNW_-_2005-Q4_-_A4_-_SAP_NetWeaver_-_Overview.pdf

    9. **分析与报表**:借助SAP NetWeaver BI(Business Intelligence),企业可以获得强大的数据分析和报表工具,实现对业务数据的深度洞察。 10. **系统管理和监控**:SAP EarlyWatch是一项监控服务,可以帮助用户...

    ABAP开发从入门到精通-高清自学版 SAP+ABAP开发从入门到精通 SAP开发自学必读 SAP SAP开发自学入门到精通

    在SAP HANA环境中,ABAP开发者需要学习如何利用HANA的特性,比如列式存储、实时分析和计算视图,来优化业务应用的性能。 在实际项目中,ABAP开发者还需要了解SAP的其他组件,如ABAP对象服务(ABAP Objects)、Web ...

    SAP ABAP开发学习——第10课:OOALV(视频教程)

    9. **性能优化**:在处理大量数据时,了解如何正确使用缓冲区和行集(Rowset)技术以提高性能是至关重要的。通过预加载数据或只在需要时加载数据,可以显著减少系统资源的消耗。 10. **集成到SAP GUI**:OOALV不仅...

    sap abap query高级功能

    SAP ABAP Query 是 SAP 系统中一种用于创建自定义报表的强大工具,尤其适合那些对 SQL 不太熟悉或者没有数据库直接访问权限的用户。它提供了丰富的功能,使得开发人员可以构建复杂的数据查询,而无需编写大量的 ABAP...

    SAP ABAP开发学习——第14课:动态SQL(视频教程)

    6. **性能优化**: - 尽量避免频繁使用动态SQL,因为它通常比静态SQL执行效率低。 - 使用`CALL FUNCTION 'DB_PREPARE'`和`CALL FUNCTION 'DB_EXECUTE'`可以预编译SQL语句,提高性能,特别是对于重复执行的查询。 ...

    从实例学SAP ABAP编程(1-19章).pdf

    14. 性能优化:了解ABAP程序的性能优化技巧,包括查询优化、内存使用优化等。 15. ABAP测试工具:学习如何使用SAP提供的工具进行ABAP代码的测试和调试,如ABAP调试器、ABAP测试工具等。 16. 开发实践:通过案例...

    ABAP-SAP学习宝典进阶语法大全

    在实际项目中,性能优化是不可忽视的环节。宝典可能包含如何分析和优化ABAP代码的策略,比如使用ABAP Profiler进行性能测试,以及如何使用ABAP SQL优化器改进Open SQL查询。 最后,标签“源码”和“工具”提示,...

    SAP ABAP编程手册

    13. **性能优化**:最后,手册可能会讨论如何通过优化ABAP代码来提高系统性能,包括使用索引、避免内存泄漏和减少数据库访问。 以上是对《SAP ABAP编程手册》可能包含内容的概述,每一章都是深入学习ABAP编程不可或...

    SAP中文教材全系列之ABAP-BC401

    7. 调试与性能优化:编程技能的高低不仅体现在能够编写代码,还在于对代码的调试和性能优化。ABAP BC401可能介绍了ABAP开发中的调试技巧和性能优化方法,帮助开发者提升代码质量。 8. 用户权限和安全:在SAP系统中...

    SAP-ABAP语法详解教材

    14. **性能优化**:掌握如何通过分析和调优提高程序性能,包括使用ABAP Profiler和DB Monitor。 15. **版本管理和变更控制**:理解SAP系统中的版本概念,以及如何进行代码版本控制和变更管理。 通过深入学习《SAP-...

    alv abap sap IBM培训资料

    ALV(ABAP List Viewer)是SAP ABAP提供的一种标准报表工具,用于展示数据表的结构化信息。IBM,作为全球知名的科技公司,其产品和服务也经常与SAP集成,为企业提供全面的解决方案。 在"alv abap sap IBM培训资料...

    ERP信息化专业资料:SAP专业资料文档LO650.doc

    10. **早期预警系统(EarlyWatch)**:SAP提供的健康检查服务,监测系统的性能和稳定性。 11. **SAP Business Workflow**:用于自动化和优化业务流程,如订单审批流程。 12. **WebFlow**:与Web相关的业务流程,...

Global site tag (gtag.js) - Google Analytics