在上一篇博客《如何减少DB的访问次数?》中谈到,为提升程序性能,在ABAP编程过程中应尽量减少DB的访问次数。与此同时,在访问DB时还应尽量减小在与DB交互的数据量,这样可减小DB通信的网络负担,提升访问速度。
性能优化是一件锱铢必较的工作,在本篇博客中,让我们一起看下使用ABAP时,可以通过哪些方式达到“减少DB交互数据量”的目标。
方式1: 避免 SELECT *
这一点很好理解,也就是在搜索时,显性指定所需的字段。尽量避免返回不必要的数据,因为任何一个字段的选取,DB都会进行相关的遍历查找,与DB交互时应尽量将数据遍历时间降到最低。
不要图方便使用SELECT * FROM sflight INTO CORRESPONDING FIELD 这样的语句。
方式2:使用WHERE语句限定搜索范围
这一点不做过多解释,合理地使用WHERE语句是任何一种编程语言的通用规范。
方式3:避免在SELECT … ENDSELECT中使用CHECK等类似的判断语句
原因同第二点,合理地通过WHERE限定数据集,仅选取有效的数据进行处理;而非在选取后,再判断数据的有效性。
方式4:使用UP TO n ROWS来限定结果集数目
使用UP TO n ROWS特别适用于选取特定条件、特定数目的SELECT。看下面的例子,从DB中选取10位折扣最大的客户,应直接使用UP TO 10 ROWS, 而非每一次手动计数。
DATA: ls_scustom TYPE scustom,
lt_scustom TYPE TABLE OF scustom WITH EMPTY KEY.
* -- Bad --*
SELECT id name discount
FROM scustom
INTO (ls_scustom-id, ls_scustom-name, ls_scustom-discount)
WHERE custtype = 'B'
ORDER BY discount DESCENDING.
IF sy-dbcnt > 10.
EXIT.
ENDIF.
WRITE:/ ls_scustom-id, ls_scustom-name, ls_scustom-discount.
ENDSELECT.
* -- Good --*
SELECT id name discount
FROM scustom UP TO 10 ROWS
INTO CORRESPONDING FIELDS OF TABLE lt_scustom
WHERE custtype = 'B'
ORDER BY discount DESCENDING.
方式5:在SELECT中使用聚合函数完成运算
在SELECT中,使用例如COUNT,SUM,MAX等函数完成数据的统计工作,直接返回运算结果。
DATA: lv_seatsocc TYPE sflight-seatsocc,
lv_sum TYPE i VALUE 0.
* -- Bad --*
SELECT seatsocc
FROM sflight INTO lv_seatsocc
WHERE carrid = 'LH'
AND fldate LIKE '2018%'.
lv_sum = lv_sum + lv_seatsocc.
ENDSELECT.
* -- Good --*
SELECT SUM( seatsocc )
FROM sflight
INTO lv_sum
WHERE carrid = 'LH'
AND fldate LIKE '2018%'.
方式6:使用UPDATE …SET更新数据库
如果只需要更新DB中某一条数据中的特定几个字段,使用UPDATE … SET无疑是最佳的方式。
DATA: ls_sflight TYPE sflight.
SELECT * FROM sflight
INTO ls_sflight UP TO 1 ROWS
WHERE carrid = 'LH'.
ENDSELECT.
* option 1 -
ls_sflight-price = ls_sflight-price + 100.
UPDATE sflight FROM ls_sflight.
* option 2 -
ls_sflight-price = ls_sflight-price + 100.
UPDATE sflight SET price = ls_sflight-price
WHERE carrid = ls_sflight-carrid
AND connid = ls_sflight-connid
AND fldate = ls_sflight-fldate.