内表类型

内表类型 (★★★)

#internal-tables

三种表类型比较

属性 标准表(STANDARD) 排序表(SORTED) 哈希表(HASHED)
键访问 线性搜索 O(n) 二分搜索 O(log n) 哈希搜索 O(1)
索引访问
排序顺序 未排序(按需排序) 始终按键排序 不适用(无顺序)
键唯一性 非唯一 唯一或非唯一 仅唯一
填充策略 APPEND(末尾追加快) INSERT(维护排序) INSERT(哈希桶)
最佳用途 顺序处理、排序、临时存储 部分顺序读取、有序访问 按键的单条记录查找
📌哈希表不支持索引访问。不能在哈希表上使用 READ TABLE ... INDEXLOOP AT ... FROM/TOINSERT ... INDEXDELETE ... INDEX

表键类别

标准键

1
DATA: lt_itab TYPE STANDARD TABLE OF struc WITH DEFAULT KEY.
  • 组件:行类型中所有平坦的非数值字段
  • 如果行类型没有合适字段:整行为键
  • 空标准键:没有任何键字段

主键

键类型 适用范围 语法
唯一 排序表、哈希表 WITH UNIQUE KEY comp1 comp2
非唯一 标准表、排序表 WITH NON-UNIQUE KEY comp1 comp2
1
2
3
4
5
6
7
" 带唯一主键的排序表
DATA: lt_sorted TYPE SORTED TABLE OF struc
WITH UNIQUE KEY id.

" 带非唯一键的标准表
DATA: lt_std TYPE STANDARD TABLE OF struc
WITH NON-UNIQUE KEY name.

次键(详见 特殊表技术

  • NW 7.0 EhP2 起可用
  • 独立于主键定义
  • 可以是 SORTED(唯一/非唯一)或 HASHED(唯一)

键访问方法

READ TABLE WITH TABLE KEY

1
2
3
4
5
6
7
8
" 标准表:线性搜索(大表较慢)
READ TABLE lt_standard INTO ls_wa WITH TABLE KEY id = '123'.

" 排序表:二分搜索(快)
READ TABLE lt_sorted INTO ls_wa WITH TABLE KEY id = '123'.

" 哈希表:哈希搜索(最快)
READ TABLE lt_hashed INTO ls_wa WITH TABLE KEY id = '123'.
  • WITH TABLE KEY:使用表的主键(或次键)
  • 根据表类型自动优化

READ TABLE WITH KEY

1
2
" 通用键搜索 - 始终线性搜索,即使在排序/哈希表上!
READ TABLE lt_sorted INTO ls_wa WITH KEY name = 'Smith'.
⚠️WITH KEY(不带 TABLE)始终执行线性搜索,即使在排序或哈希表上也是如此。只有 WITH TABLE KEY 使用优化的访问方法。

索引访问方法

1
2
3
4
5
6
7
8
9
10
+-------------------+-----------------------------+-------------------+
| 操作 | 语句 | 表类型 |
+-------------------+-----------------------------+-------------------+
| 按索引读取 | READ TABLE ... INDEX n | 标准、排序 |
| 范围循环 | LOOP AT ... FROM n TO m | 标准、排序 |
| 按索引修改 | MODIFY ... INDEX n | 标准、排序 |
| 按索引删除 | DELETE ... INDEX n | 标准、排序 |
| 按索引插入 | INSERT ... INDEX n | 仅标准表 |
| 末尾追加 | APPEND ... | 仅标准表 |
+-------------------+-----------------------------+-------------------+
1
2
3
4
5
6
7
8
9
10
11
12
13
" 索引读取
READ TABLE lt_sorted INTO ls_wa INDEX 5.

" 范围循环
LOOP AT lt_sorted INTO ls_wa FROM 10 TO 20.
" 处理第 10 到 20 行
ENDLOOP.

" 按索引修改
MODIFY lt_standard FROM ls_wa INDEX 3.

" 按索引删除
DELETE lt_standard INDEX 7.

选择正确的表类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
                  主要访问模式是什么?
|
+---------------+---------------+
| |
按键访问 索引/顺序访问
| |
+------+------+ +--------+--------+
| | | |
大部分是 需要排序 顺序处理 填充后需要
单条查找 顺序用于 (用 APPEND 排序吗?
范围读取 填充)
| | | +----+----+
HASHED SORTED STANDARD 是:STANDARD
(唯一键) (唯一或 (用 APPEND + SORT
非唯一) 填充) 排序
否:SORTED(自动
维护顺序)
场景 推荐类型 原因
按键查找单条记录 哈希表 O(1) 访问
按键顺序处理记录 排序表 始终排序,二分搜索
收集后排序 标准表 APPEND 快,按需 SORT
部分范围读取(键边界) 排序表 二分搜索 + 顺序
临时无序存储 标准表 最简单,最灵活
按键计数/聚合 哈希表 + COLLECT 唯一键确保正确聚合

表类型声明示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
" 标准表
TYPES: ty_standard TYPE STANDARD TABLE OF struc
WITH NON-UNIQUE KEY id.

" 排序表
TYPES: ty_sorted TYPE SORTED TABLE OF struc
WITH UNIQUE KEY id.

" 哈希表
TYPES: ty_hashed TYPE HASHED TABLE OF struc
WITH UNIQUE KEY id.

" 内联声明(默认标准表)
DATA(lt_inline) = VALUE ty_standard( ).

键访问性能汇总

1
2
3
4
5
表类型           WITH TABLE KEY    WITH KEY     INDEX
----------- -------------- --------- -----
STANDARD O(n) 线性 O(n) 线性 O(1)
SORTED O(log n) 二分 O(n) 线性 O(1)
HASHED O(1) 哈希 O(n) 线性 不适用
💡按主键搜索时始终使用 WITH TABLE KEY 以获得该表类型的最佳性能。

考试/测试模式

关键词/模式 答案
“哈希表无索引” 不能在哈希表上使用 INDEX、FROM/TO 或位置访问
“WITH TABLE KEY vs WITH KEY” TABLE KEY 使用优化访问;WITH KEY 始终线性
“排序表始终有序” 记录自动按键顺序维护
“哈希表唯一键” 哈希表要求唯一键;重复会导致 CX_SY_ITAB_DUPLICATE_KEY
“标准表线性搜索” 键访问 O(n);排序后可使用 BINARY SEARCH
“单条记录查找最佳” 哈希表 (O(1))
“范围读取最佳” 排序表(二分 + 顺序)
“APPEND vs INSERT” APPEND 在末尾添加(标准表);INSERT 维护排序(排序/哈希)
“标准键组件” 行类型中所有平坦的非数值字段

相关笔记