1.使用WHERE条件减少循环次数;
推荐:
SELECTION-OPTIONS: s_vbeln FOR vbak-vbeln.
LOOP AT itab WHERE vbeln IN s_vbeln.
……
ENDLOOP.
不推荐:
SELECTION-OPTIONS: s_vbeln FOR vbak-vbeln.
LOOP AT itab.
IF itab-vbeln IN s_vbeln.
……
ENDIF.
ENDLOOP.
2.尽量避免使用MOVE-CORRESPONDING 和 INTO CORRESPONDING FIELDS OF;
CORRESPONDING语句在系统内部存在隐式操作:
这条以前还真没注意到,不过不用-CORRESPONDING的话,得特别小心字段的匹配,不然不报错就是数据对不上了。
3.使用SORTED TABLE 和 HASHED TABLE表类型;
4.使用 BINARY SEARCH 二分查找算法;
这个也有注意事项;
必须根据查询条件进行排序,而且必须是升序,也就是系统默认的排序、
5.使用较高效的 DELETE ADJACENT DUPLICATES FROM 删除内表邻近重复记录;
就是说你用select的时候不要排除重复项,当然你也得注意排序,保留的规则是第一条数据;
6.使用较高效的COLLECT语句对记录进行聚集加总;
注意: COLLECT语句的效率只体现在当你使用的是顺序表和哈希表的时候,或者内表经过有效排序之后。否则当内表数据过多时,检索时间会很长,一般不推荐使用在记录条数非常多的标准表。
7.嵌套loop语句,可以用先read在loopat from。
这个我得重点说下了,相信很多人看不太明白,认真看下下面这段代码
LOOP AT LT_VDGROUP INTO LS_VDGROUP02 WHERE VGROUP = LS_VDGROUP01-VGROUP.
READ TABLE IT_REL ASSIGNING <L_FS_REL> WITH KEY LIFNR = LS_VDGROUP02-LIFNR
BINARY SEARCH.
IF SY-SUBRC = 0.
LOOP AT IT_REL ASSIGNING <L_FS_REL> FROM SY-TABIX.
IF <L_FS_REL>-LIFNR <> LS_VDGROUP02-LIFNR.
EXIT.
ENDIF.
READ TABLE IT_REL2 ASSIGNING <L_FS_REL2> WITH KEY
EBELN = <L_FS_REL>-EBELN BINARY SEARCH.
IF SY-SUBRC <> 0 .
ADD <L_FS_REL>-BRTWR TO <G_FS_VENDOR>-UNDEL.
ENDIF.
ENDLOOP.
ENDIF.
ENDLOOP.
怎样降低数据库负载
说白了就是减少I/O操作
1.避免使用SELECT … ENDSELECT语句;
2.避免使用SELECT *;
3.使用FOR ALL ENTRIES IN 语句联接数据表和内表;
这个值得推敲
4.使用索引提高查询效率;
5.避免使用SQL 的ORDER BY 语句, SORT语句会更高效;
6.使用SQL聚合函数MAX, MIN, COUNT, AVG, SUM。
程序内存使用的优化-1
OCCURS n 代表初始化内表的空间大小为n(空间固定), 当内表存储记录条数超出n时, 系统将依靠页面文件存放超出部分的数据。 当系统内存资源十分紧缺的时候, 我们可以使用OCCURS n的初始化方法,但是这样的效率稍微慢。
OCCURS 0 代表初始化内表的空间大小为无限,当内表存储记录条数不断增加时, 内表所使用的内存空间不断扩大, 直到系统无法分配为止。 使用内存比使用页面交换更快一些,但是要考虑系统的资源状态。
程序内存使用的优化-2
SELECT …… INTOTABLE itab PACKAGE SIZE 100 FROM VABK ……
该语句实现没次打开DB会话时, 往应用服务器上传输100条记录, 然后关闭会话,刷新缓存。 用于在数据库缓存资源紧缺的情况使用。
RefreshITAB;
Free ITAB.