SAP ABAP 性能优化技巧 — 使用 “for all entries”

在select语句后面的where附加项中可以使用左关联,这会极大的提高程序速度,但同时也有一些局限,如下: 重复项会被从结果数据集中自动删除,因此要注意在select语句中需要给出详细的唯一关键字组合。 如果 For All Entries IN 字段修饰的内表是空表的话,源表的所有行都会被选入目标表中。因此在使用前一定要首先检查第一个表是否为空,这一点很重要,否则会有performance问题。 如果 For All Entries IN 字段修饰的内表很大的话,程序速度反而会减慢,而不是加快。因此应该尽量使该表的数据量控制在一个适当的大小。 不推荐使用: Loop at int_cntry. Select single * from zfligh into int_fligh where cntry = int_cntry-cntry. Append int_fligh. Endloop. 推荐使用: IF NOT int_cntry[] IS INITIAL.   Select * from zfligh appending table int_fligh For all entries in int_cntry Where cntry = int_cntry-cntry. ENDIF. […]

SAP ABAP 性能优化技巧 — 缓存表

推荐使用缓存表因为它可以显著提高程序速度。但是使用以下语句的时候缓存表会被跳过: Select distinct Select … for update Order by, group by, having字段 Joins 在 select 命令后面使用 bypass buffer 附加语句可以明确跳过缓存表。 返回文章目录

SAP ABAP 性能优化技巧 — 向内表添加纪录

与其使用一般的 loop-endloop 方法来实现向内表添加多条记录,不如使用 append 命令的变体将一个内表的所有记录一次性添加入另一个内表。要注意的是两个内表的结构定义必须完全一样。 不推荐使用: Loop at int_fligh1. Append int_fligh1 to int_fligh2. Endloop. 推荐使用: Append lines of int_fligh1 to int_fligh2. 返回文章目录

SAP ABAP 性能优化技巧 — 使用二分查找(Binary Search)选项

READ命令使用顺序查找数据表,这会降低处理速度。取而代之,使用binary search的附加命令,可以使用二分查找算法,可以帮助加快内表查找速度。 在使用binary search之前必须首先将内表排序,否则有可能找不到记录,因为二分查找反复将查找区间对半划分,如果要查找的值小于查找区间的中间位置的数据项值,则查找区间将缩小到前半个区间,否则查找将局限于后半区间。要了解更多的关于二分查找算法介绍,请点击这里。 不推荐使用: Read table int_fligh with key airln = ‘LF’. 推荐使用: SORT int_fligh by airln. Read table int_fligh with key airln = ‘LF’ binary search. 返回文章目录

SAP ABAP 性能优化技巧 – 修改一组纪录

修改一个内表的多行纪录 使用modify命令的不同形式加快这种操作的处理速度。 不建议使用: Loop at int_fligh. If int_fligh-flag is initial. Int_fligh-flag = ‘X’. Endif. Modify int_fligh. Endloop. 建议使用: Int_fligh-flag = ‘X’. Modify int_fligh transporting flag where flag is initial. 返回文章目录

SAP ABAP 性能优化技巧 –- “into table” 语句

使用select 命令的 into table语句 与其一行一行的读取数据添加入内表,不如一次性取出所有数据行。 不建议使用: Refresh: int_fligh. Select * from zflight into int_fligh.   Append int_fligh.   Clear int_fligh. Endselect. 建议使用: Refresh: int_fligh. Select * from zflight into table int_fligh. 返回文章目录

SAP ABAP 性能优化技巧 – 视图取代基本表

使用视图取代基本表 很多时候 ABAP 程序员需要使用基本表和嵌套的选择。其实我们应该查看一下是否有SAP已经提供的这些基本表的某些视图可供使用,以便直接获得想要的数据,而不用特别编写代码来获取。 不建议使用: Select * from zcntry where cntry like ‘IN%’. Select single * from zflight where cntry = zcntry-cntry and airln = ‘LF’. Endselect. 建议使用: Select * from zcnfl where cntry like ‘IN%’ and airln = ‘LF’. Endselect. 返回文章目录

SAP ABAP 性能优化技巧 — 集合函数

可以使用ABAP提供的集合函数取代ABAP代码来获得最大或最小值。 不建议使用: Maxnu = 0. Select * from zflight where airln = ‘LF’ and cntry = ‘IN’.   Check zflight-fligh > maxnu.   Maxnu = zflight-fligh. Endselect. 建议使用: Select max( fligh ) from zflight into maxnu where airln = ‘LF’ and cntry = ‘IN’. 其它可用集合函数还有 min (最小值), avg (平均值), sum (求和) and count (数据选择的行数). 返回文章目录

SAP ABAP 性能优化技巧 — 选择条件

在从数据库中读取数据时最好直接在select语句中加入选择条件,从而直接限制筛选出符合条件的数据,而不建议读出所有的数据然后用ABAP代码来过滤筛选。 例如,不建议使用: Select * from zflight. Check : zflight-airln = ‘LF’ and zflight-fligh = ‘BW222’. Endselect. 建议使用: Select * from zflight where airln = ‘LF’ and fligh = ‘222’. Endselect. 这里还要提醒的一点是关于 select *。通常这是一个懒惰的做法,程序员使用select * 的时候其实可能只有一两个字段需要选择。这实际上会显著减慢程序的运行速度,并在整个系统上加载不必要的负担。当应用服务器将这个请求发送到数据库服务器的时候,数据库服务器不得不将每一行数据的整个结构都发送回应用服务器。这样既浪费CPU,又浪费网络带宽资源,尤其是在表结构很大的时候。 因此建议只选择那些需要的字段,以便使数据库服务器只传递少量数据回来。 另外还建议尽量避免将选择的数据字段逐个写入本地变量中,这也会加重服务的负担。比较好的做法应该是直接将读取的数据写入内表(internal table)中,例如: Select * from zflight into table it_flights where airln = ‘LF’ and fligh = ‘222’. 返回文章目录

SAP ABAP 性能优化技巧

本文译自 theSpot4SAP.com的SAP ABAP Performance Tuning Tips & Tricks Introduction 性能优化的必要性 ABAP是SAP编程中的通用语言。在很多工程项目中,一个重要的任务都是尽快组建一支ABAP程序员队伍,将设计文档交给他们,然后在计划工期之内完成ABAP程序的编写。 在这种期限的压力之下,往往程序的效率就被忽略了。一个有效的程序应该能够在有限的时间内产生要求的输出,时间的长短取决于程序的复杂度,而不是像我们常常听到的那样,开始运行一个程序然后午饭回来后再看结果。 也许以上说法有些夸张,但一个性能优化的ABAP程序的确可以为终端用户节省时间,从而增加用户的产量,反过来也取悦了用户和管理者。 这个教程着重介绍各种性能优化的技巧使得ABAP的程序可以更加有效的完成它们的工作。教程面向已熟练掌握ABAP各种概念和语法的编程人员。 说明:程序的性能很多时候也是受到硬件的限制,这些不在本文的讨论范围之内。 ======================================================================= 本教程分为以下几章,每一章介绍一种技巧: 教程简介 (本页) 选择条件 (Selection criteria) 集合函数 (Aggregate functions) 视图取代基本表 (Views instead of base tables) “into table” 语句 (The “into table” clause) 修改一组纪录 (Modifying a group of lines) 使用二分查找选项 (Use of binary search option) 向内表添加纪录 (Appending two internal tables) 缓存表 (Table buffering) […]