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