【02】SAP ABAP性能优化 - 如何减少与DB交互的数据量?

在上一篇博客《如何减少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.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十年铸器

给作者赏杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值