【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類型的次鍵。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章