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.