【04】SAP ABAP性能优化 - 如何选用内表类型(STANDARD, SORTED, HASHED)?

ABAP提供了三种类型的内表, 即:标准表(Standard Table), 排序表(Sorted Table), 哈希表(Hashed Table)。在未声明内表类型时,系统会将类型默认为标准表。

然而,标准表其实并不适用于所有的业务场景,我们应当根据实际的需求,定义使用合适类型的内表。

1. 内表的类型

让我们回顾下不同内表的访问方式。标准表和排序表是可以既通过index访问,有可通过key访问;而哈希表只能通过键值访问。

三种内表的特征如下表:

内表类型访问方式主键推荐方式查找算法
标准表索引访问、键值访问NON-UNIQUE KEY索引访问顺序查找法、二分查找法
排序表索引访问、键值访问NON-UNIQUE KEY 、UNIQUE KEY键值访问二分查找法
哈希表键值访问UNIQUE KEY键值访问哈希算法

2. 使用原则

  • 标准表:当数据量较小(<100 entries), 并既需要使用索引访问,又需要通过不同的键值访问时,可以定义使用标准表。当通过键值访问时,应当使用SORT + BINARY SEARCH的语法,也即使用二分查找算法替代顺序查找。在排序时,应尽量明确指定排序的字段。
  • 排序表:当访问内表的主要方式是通过“主键访问”时,应定义使用排序表。排序表的主键可以不唯一。
  • 哈希表:完全通过主键访问数据,并且在数据量较大时,应使用Hash表。在数据量不大时,Hash表的查找速度和Sorted表类似。在某种程度上,Hash表的性质等同于主键唯一的Sorted表。

3. 注意事项

  • 避免通过顺序查找的方式访问含有大量数据的内表;
  • 避免在嵌套的循环中,通过顺序查找的方式访问内表;
  • 无论哪一种内表,都要避免内表数据过大的情况发生,因为CPU的内存是有限的,无限制增加内表的数据量会至系统DUMP;
  • 对于大数量的情形,应采用分批次、分包的处理方式。

4. 示例

示例1: 对于标准表,使用二分查找替代顺序查找

DATA: lt_sflight        TYPE STANDARD TABLE OF sflight,
      ls_sflight        TYPE sflight.
*-------------------------------------------------------
* 标准表
SELECT * FROM sflight
   INTO TABLE lt_sflight UP TO 100 ROWS
        WHERE carrid = 'AA'
           OR carrid = 'LH'.
*-------------------------------------------------------           
* standard table - sequential read
*-------------------------------------------------------      
READ TABLE lt_sflight INTO ls_sflight
                  WITH KEY carrid = 'AA'
                           connid = '0064'
                           fldate = '20180403'.
IF sy-subrc = 0.
  WRITE: / ls_sflight-carrid, ls_sflight-planetype.
ENDIF.
*-------------------------------------------------------
* standard table - read with binary search
*-------------------------------------------------------      
SORT lt_sflight BY carrid connid fldate.
READ TABLE lt_sflight INTO ls_sflight
             BINARY SEARCH
                  WITH KEY carrid = 'AA'
                           connid = '0064'
                           fldate = '20180403'.
IF sy-subrc = 0.
  WRITE: / ls_sflight-carrid, ls_sflight-planetype.
ENDIF.

示例2: 使用主键不唯一的排序表

DATA:  lt_sflight_sorted TYPE SORTED TABLE OF sflight WITH NON-UNIQUE KEY carrid connid fldate,
       ls_sflight        TYPE sflight.
*-------------------------------------------------------
* 排序表
*-------------------------------------------------------
SELECT * FROM sflight
   INTO TABLE lt_sflight_sorted UP TO 100 ROWS
        WHERE carrid = 'AA'
           OR carrid = 'LH'.

READ TABLE lt_sflight_sorted INTO ls_sflight
      WITH TABLE KEY carrid = 'AA'
                     connid = '0064'
                     fldate = '20180403'.

IF sy-subrc = 0.
  WRITE: / ls_sflight-carrid, ls_sflight-planetype.
ENDIF.

示例3: 定义并使用哈希表

DATA: lt_sflight_hashed TYPE HASHED TABLE OF sflight WITH UNIQUE KEY carrid connid fldate,
      ls_sflight        TYPE sflight.
*-------------------------------------------------------
* 哈希表
*-------------------------------------------------------
SELECT * FROM sflight
   INTO TABLE lt_sflight_hashed UP TO 100 ROWS
        WHERE carrid = 'AA'
           OR carrid = 'LH'.

READ TABLE lt_sflight_hashed INTO ls_sflight
      WITH TABLE KEY carrid = 'AA'
                     connid = '0064'
                     fldate = '20180403'.

IF sy-subrc = 0.
  WRITE: / ls_sflight-carrid, ls_sflight-planetype.
ENDIF.
  • 5
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

十年铸器

给作者赏杯咖啡

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

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

打赏作者

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

抵扣说明:

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

余额充值