大部分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。

提示: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 vgbel vgpos

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万行,则每个READ TABLE语句平均需要4万次才能搜索到it_lips的目标行。由于it_vbap有10万个行项目,我们一共需要搜索40亿次,太慢了!

在此针对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自动过滤掉一条。

SAP报表的性能优化SAP报表的性能优化相关推荐

  1. SAP WM初阶之TO报表LX12 - TOs Resident Documents(Detailed Overview)

    SAP WM初阶之TO报表LX12 - TOs Resident Documents(Detailed Overview) SAP WM模块里的TO的报表LX12 – Detailed Overvie ...

  2. SAP WM初阶之TO报表LX10 - Evaluation of movements per storage type

    SAP WM初阶之TO报表LX10 - Evaluation of movements per storage type SAP WM模块有比较有用的报表,可以用来按存储类型来统计货物移动数量(TO数 ...

  3. SAP RETAIL分配表的查询报表

    SAP RETAIL分配表的查询报表 SAP零售系统针对分配表,也提供了报表查询功能.本文就SAP提供的2个常用的分配表查询报表做一个简单的说明. 1, 事务代码WA31 - Allocation T ...

  4. SAP MM ME81N PO Value Analysis报表中Net Value 为负数是怎么回事?

    SAP MM ME81N PO Value Analysis报表中Net Value 为负数是怎么回事? ME81N 报表中,如下PO的net value为负数, 怎么回事? 经查这些PO都是退货采购 ...

  5. 【中亦安图】清算/报表/日终跑批程序之性能优化案例(5)

    第一章 技术人生系列 · 我和数据中心的故事(第五期)-清算/报表/日终跑批程序之性能优化案例(一) 中亦安图 | 2016-02-18 21:40 前言 不知不觉,技术人生系列·我和数据中心的故事来 ...

  6. 深入源码探索:SAP 标准报表怎样实现不同「报表格式/清单类型」的输出?

    深入源码探索:SAP 标准报表怎样实现不同「报表格式/清单类型」的输出? 简介: 我们知道 SAP 有 3 种常见的报表格式,分别是网格控制(Grid control).标准清单(Normal lis ...

  7. SAP MM模块常用的标准报表

    MM模块常用的标准报表 一. 采购订单查询 采购订单的查询,可以根据供应商.物料号或者采购订单号码进行查询显示. 事务代码和路径: ME2L:后勤 -> 物料管理 -> 采购 ->  ...

  8. SAP HANA插上32路CPU,性能多大飞跃?

    ZD至顶网服务器频道 04月01日 新闻消息:随着大数据时代的来临,来源于生产.运营.研发.销售过程中的数据越来越大,不仅充分反映着企业当前的经营状况,也为企业未来的经营决策提供有力依据,但是要分析如 ...

  9. 40岁的报表工程师被“优化”:报表不会做,只能被淘汰

    老规矩,好东西在文末! 最近在朋友圈里看到一位一线大厂的报表工程师被"辞职"了,这位老兄也算是公司里的老臣了,但是却在公司组织架构变动时首当其冲被优化掉了, 这十几年来他几乎每天都 ...

最新文章

  1. ●洛谷P3688 [ZJOI2017]树状数组
  2. python解释器的安装步骤-Python本地及虚拟解释器配置过程解析
  3. 技术盘点:消息中间件的过去、现在和未来
  4. java web 自定义标签_JavaWeb学习——自定义标签
  5. 前端学习(2839):swiper属性
  6. SQLite性能提升10倍的Web数据库
  7. 两周,好多人的帮助解决select空列不显示的function
  8. MariaDB ColumnStore一些限制和BUG总结
  9. 兄弟连视频教程下载地址汇总-2014
  10. Eviews6 7 软件安装包
  11. 红宝书(javascirpt高级程序设计)学习笔记(一)
  12. pb获取当月最后一天
  13. Python网络爬虫与信息提取——网络爬虫Scrapy框架
  14. win10 往vmware 黑苹果系统无法拖拽复制问题
  15. html年龄0-120岁正则,正则表达式
  16. AutoCAD WS for iPhone, iPod toch, and iPad
  17. 690-文件管理和文件系统
  18. 监督学习三要素——模型、参数、目标函数
  19. Android设备与外接U盘实现数据读取操作
  20. 猫眼电影爬取(woff 字体文件解析)

热门文章

  1. [转载]配置unp.h头文件环境
  2. Android—TableLayout自定义表格
  3. 【百度地图API1.1】修改文本标注的样式
  4. Oracle init.ora常用配置详解
  5. C#中readonly, const 和 in型参数使用
  6. 2011年度最佳10款免费的 WordPress 主题
  7. SNORT入侵检测系统
  8. bootstrap-table表格插件的使用案例
  9. Creating a custom ComboBox item renderer in Flex
  10. ArcGIS时态数据应用——动态展示3个月内犯罪案件数量变化