在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类型的次键。