一、降低CPU负载
1.尽量避免使用MOVE-CORRESPONDING 和 INTO CORRESPONDING FIELDS OF.
CORRESPONDING语句在系统内部存在隐式操作:
a. 检查元素名称匹配;
b. 检查元素类型匹配;
c.元素类型转换;
SELECT vbeln posnr INTO TABLE itab
FROM vbak WHERE vbeln = p_vbeln.
Itab2 = itab1.
|
推荐
|
SELECT vbeln as fld1 posnr as fld2
INTO TABLE itab FROM vbak
WHERE vbeln = p_vbeln.
LOOP AT itab1 INTO wa.
Itab2-fld1 = wa-matnr.
Itab2-fld2 = wa-meins
APPEND itab2.
ENDLOOP.
|
推荐
|
SELECT * INTO CORRESPONDING
FIELDS OF TABLE itab FROM vbak
WHERE vbeln = p_vbeln.
LOOP AT itab1 INTO wa.
MOVE-CORRESPONDING wa to itab2.
APPEND itab2.
ENDLOOP.
|
不推荐
|
2.使用BINARY search 二分查找算法
一般线性查找的缺点就是耗时, 而二分查找比线性查找更高效.
注意: 使用BINARY SEARCH前必须对内表进行按索引排序.
SORT TABLE itab2 BY vbeln posnr.
READ TABLE itab2 WITH KEY vbeln = Itab1-vbeln
AND posnr = itab1-posnr BINARY SEARCH.
|
时间复杂度为O(logn)阶
|
推荐
|
READ
TABLE itab2 WITH KEY vbeln = Itab1-vbeln
AND posnr = itab1-posnr.
|
时间复杂度为
O(n)阶.
|
不推荐
|
二、降低数据库负载(减少IO操作)
1、避免使用SELECT … ENDSELECT语句.
SELECT ENDSELECT语句其实是一个循环体, 为了减少循环次数, 建议使用一次性TABLE赋值赋值.
SELECT ebeln AS ekknebeln INTO TABLE it_ebeln
FROM ekko WHERE ebeln = p_ebeln .
|
推荐
|
SELECT ebeln INTO it_ebeln-ekkebeln
FROM ekko WHERE ebeln = p_ebeln .
APPEND it_ebeln .
ENDSELECT.
|
不推荐
|
2、避免使用SELECT *.
3、使用FOR ALL ENTRIES IN 语句联接数据表和内表.
4、使用FOR ALL ENTRIES IN 语句联接数据表和内表.
使用的时机:
a. 簇表是禁止JOIN的表类型, 当需要联接簇表查询数据时;
b. JOIN超过3个表会出现性能问题, 当使用JOIN联接的表超过3个时.
SELECT … INTO TABLE itab_ekko FROM ekko.
SELECT … INTO TABLE itab_ekpo FROM ekpo
FOR ALL ENTERIS IN itab_ekko
WHERE ebeln = itab_ekko-ebeln……
LOOP AT itab_ekko.
READ itab_ekpo WITH KEY ebeln = itab_ekko.
……
APPEND itab.
ENDLOOP.
|
推荐
|
SELECT … INTO itab FROM EKKO
JOIN EKPO ON EKKO~EBELN = EKPO~EBELN
JOIN EKKN ON ……
JOIN MARA ON ……
……
|
不推荐
|
5、Loop 里面避免 select.
Append lines of itab to itab1.
Sort itab1 by matnr.
DELETE ADJACENT DUPLICATES FROM itab1 COMPARING matnr.
Select matnr maktx into table lt_makt from makt
For all entries in itab1 where matnr = itab1-matnr.
Sort lt_makt by matnr.
Loop at itab.
Read table lt_makt with key matnr = itab1-matnr
BINARY SEARCH.
Itab-maktx = lt_makt-maktx.
Endloop.
|
推荐
|
Loop at itab.
select single maktx into itab-maktx from makt
where matnr = itab-matnr.
Endloop.
|
不推荐
|
三、内存使用的优化
1、使用SELECT … PACKAGE SIZE n 分段查询数据,减低数据库缓存负担.
SELECT …… INTO TABLE itab PACKAGE SIZE 100 FROM VABK ……
该语句实现每次打开DB会话时, 往应用服务器上传输100条记录, 然后关闭会话, 刷新缓存。 用于在数据库缓存资源紧缺的情况使用。
2.Loop 里面避免套用 loop.
Data tabix type sy-tabix
Sort itab1 by matnr.
Loop at itab.
Read table itab1 with key matnr = itab-matnr BINARY SEARCH.
if sy-subrc = 0.
tabix = sy-tabix.
loop at itab1 from tabix.
if itab1-matnr <> itab-matnr.
exit
endif.
……
endloop.
endif.
endloop.
|
推荐
|
Loop at itab .
Loop at itab1 where matnr = itab-matnr.
……
Endloop.
Endloop.
|
不推荐
|
总结:
1.Loop 里面避免 select.
2.Loop 里面避免套用 loop.
3.Loop 里面避免嵌套函数.
4.尽量多使用二分法来读取loop里面的内表.
5.多使用FOR ALL ENTRIES IN 限制子表的取数,切记要判断是否为空.
6.Select 查询 后面跟的range表里面的数据最好不超过1000条.
7.Select 查询最好把字段全写出来 避免写*.