在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類型的次鍵。