【05】SAP ABAP性能优化 - 使用次键(Secondary Keys)提升内表查询性能

在SAP NW 7.02以上的版本,ABAP语言支持了对于内表“次键”的定义。

上一篇博客《SAP ABAP性能优化 - 如何选用内表类型》中介绍了在不同的场景下,如何合适地选择并使用内表,在本篇博客中,我将介绍如何在选定的内表类型的基础上,进一步通过“次键”来优化ABAP的内表访问效率。

1. 什么是次键?

次键(Secondary Keys)是相对于内表的主键(Primary Keys)而言的第二级键值。

通常内表的类型便决定了内表访问的数据索引方式 - 例如标准表是“线性查找”,排序表是“二分查找”,哈希表通过“哈希算法”进行查找。

但这是基于主键访问的基础上的。如果对于哈希表的访问是通过非主键字段进行时,那么查找方式又将会是“线性查找”,而线性查找对于大数据量而言是效率最低的方式。

如何解决这种问题呢?答案就是为内表定义次键(Secondary Key)。

**********************************************************************
* secondary key for internal table
**********************************************************************

DATA: ls_sflight     TYPE sflight,
      lt_sflight_hsh TYPE HASHED TABLE OF sflight WITH UNIQUE KEY carrid connid fldate
                     WITH NON-UNIQUE SORTED KEY sec_key COMPONENTS carrid planetype.

SELECT * FROM sflight INTO TABLE lt_sflight_hsh
  UP TO 100 ROWS
 WHERE carrid = 'AA' OR carrid = 'LH'.

* Access data via 'primary table key' - Hash search
READ TABLE lt_sflight_hsh INTO ls_sflight
                WITH TABLE KEY carrid = 'AA'
                               connid = '017'
                               fldate = '20171226'.

* Access data via normal key - linear searchxian
READ TABLE lt_sflight_hsh INTO ls_sflight
                      WITH KEY carrid = 'AA'
                               planetype = 'A380-800'.

* Access data via secondary key -  binary search
READ TABLE lt_sflight_hsh INTO ls_sflight
                      WITH TABLE KEY sec_key
                          COMPONENTS carrid = 'AA'
                                     planetype = 'A380-800'.

在上例中,内表sflight中存储了大量的航班数据,最常用的访问方式是通过主键访问,因此将内表定义为了Hash类型。
但除此之外,使用字段carrid和planetype的访问频率也非常高的,因此,我们可以将carrid 和planetype定义为sorted次键, 使得在通过次键访问数据时的查找方式变为“二分查找”,以提升访问效率。

2.注意事项

次键虽然可以提升内表的访问效率,但次键的生成、存储和管理也是耗费运行内存的。在使用次键时,应注意以下几点:

  • 对于小数据量的内表(<50 entries),没有必要使用次键。因为,在此种数据量下,对于次键管理的消耗是大于由次键所带来的效率提升的;
  • 对于需要不断变动的内表,不推荐使用次键,应为每次内表变动后,系统也将会对次键的管理进行更新。次键带来的效率损失大于效率提升;
  • 若非数据的唯一性十分重要,尽量避免使用hash类型的次键。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

十年铸器

给作者赏杯咖啡

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

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

打赏作者

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

抵扣说明:

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

余额充值