内表有三种分类:标准、哈希、排序。
哈希内表和排序内表必须指定键值(键值不能重复)。三种内表在读取的时候时间是有差异的,用如下代码进行验证:有兴趣的可以在自己系统中执行如下代码,
PS:客户号 = 系统存在的客户号。
语句1
TYPES:BEGIN OF ty_kna1 ,
kunnr TYPE kunnr,
land1 TYPE land1_gp,
name1 TYPE name1_gp,
END OF ty_kna1.
DATA gs_kna1 TYPE ty_kna1.
DATA gt_kna1 TYPE STANDARD TABLE OF ty_kna1.
SELECT kunnr land1 name1 FROM kna1 CLIENT SPECIFIED
INTO TABLE gt_kna1
WHERE mandt = '400'.
SORT gt_kna1 BY KUNNR.
DO 1000000 TIMES.
READ TABLE gt_kna1 INTO gs_kna1 WITH KEY KUNNR = '客户号'
BINARY SEARCH.
ENDDO.
语句2
TYPES:BEGIN OF ty_kna1 ,
kunnr TYPE kunnr,
land1 TYPE land1_gp,
name1 TYPE name1_gp,
END OF ty_kna1.
DATA gs_kna1 TYPE ty_kna1.
DATA gt_kna1 TYPE HASHED TABLE OF ty_kna1
WITH UNIQUE KEY kunnr .
SELECT kunnr land1 name1 FROM kna1 CLIENT SPECIFIED
INTO TABLE gt_kna1
WHERE mandt = '400'.
DO 1000000 TIMES.
READ TABLE gt_kna1 INTO gs_kna1 WITH TABLE KEY KUNNR = '客户号'.
ENDDO.
语句3
TYPES:BEGIN OF ty_kna1 ,
kunnr TYPE kunnr,
land1 TYPE land1_gp,
name1 TYPE name1_gp,
END OF ty_kna1.
DATA gs_kna1 TYPE ty_kna1.
DATA gt_kna1 TYPE SORTED TABLE OF ty_kna1 WITH UNIQUE key kunnr .
SELECT kunnr land1 name1 FROM kna1 CLIENT SPECIFIED
INTO TABLE gt_kna1
WHERE mandt = '400'.
DO 1000000 TIMES.
READ TABLE gt_kna1 INTO gs_kna1 WITH TABLE KEY KUNNR = '客户号'.
ENDDO.
以上语句中可以验证标准内表和哈希内表,在内表数据量很大或者需要多次读取时哈希内表占绝对优势。在三种类型的内表中,哈希内表的读取最快,标准内表的二分查找次之,排序内表最慢。
哈希内表不能通过APPEND 去添加记录。一般通过OPEN SQL取得数据存入哈希内表。哈希内表的键值设定很重要,若设置不当出现重复记录的话,整个SQL语句会DUMP。提示如下错误:A row with the same key already exists.
鉴于上面情况,若内表数据量大(2w以上),需要使用哈希内表提高在应用服务器上的执行时间时,一定要注意哈希主键的设定。
**********************************************
如果在LOOP循环中更新内表数据,通常有如下两种做法
语句1
TYPES:BEGIN OF ty_kna1 ,
kunnr TYPE kunnr,
land1 TYPE land1_gp,
name1 TYPE name1_gp,
END OF ty_kna1.
DATA gs_kna1 TYPE ty_kna1.
DATA gt_kna1 TYPE STANDARD TABLE OF ty_kna1 .
SELECT kunnr land1 name FROM kna1 CLIENT SPECIFIED
INTO TABLE gt_kna1
WHERE mandt = '400'.
FIELD-SYMBOLS <fs> TYPE ty_kna1.
DO 10 TIMES.
LOOP AT gt_kna1 ASSIGNING <fs>.
<fs>-land1 = 'CN'.
ENDLOOP.
ENDDO.语句2
TYPES:BEGIN OF ty_kna1 ,
kunnr TYPE kunnr,
land1 TYPE land1_gp,
name1 TYPE name1_gp,
END OF ty_kna1.
DATA gs_kna1 TYPE ty_kna1.
DATA gt_kna1 TYPE STANDARD TABLE OF ty_kna1 .
SELECT kunnr land1 name1 FROM kna1 CLIENT SPECIFIED
INTO TABLE gt_kna1
WHERE mandt = '400'.
DO 10 TIMES.
LOOP AT gt_kna1 INTO gs_kna1.
gs_kna1-land1 = 'CN'.
MODIFY gt_kna1 FROM gs_kna1.
ENDLOOP.
ENDDO.
很明显,使用指针处理内表的执行效能更高,这种优势在内表数据很大时,非常明显。原理就不在说了,大家都知道!