内表类型
内表类型 (★★★)
#internal-tables
三种表类型比较
| 属性 | 标准表(STANDARD) | 排序表(SORTED) | 哈希表(HASHED) |
|---|---|---|---|
| 键访问 | 线性搜索 O(n) | 二分搜索 O(log n) | 哈希搜索 O(1) |
| 索引访问 | 是 | 是 | 否 |
| 排序顺序 | 未排序(按需排序) | 始终按键排序 | 不适用(无顺序) |
| 键唯一性 | 非唯一 | 唯一或非唯一 | 仅唯一 |
| 填充策略 | APPEND(末尾追加快) | INSERT(维护排序) | INSERT(哈希桶) |
| 最佳用途 | 顺序处理、排序、临时存储 | 部分顺序读取、有序访问 | 按键的单条记录查找 |
📌哈希表不支持索引访问。不能在哈希表上使用
READ TABLE ... INDEX、LOOP AT ... FROM/TO、INSERT ... INDEX 或 DELETE ... 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 | " 带唯一主键的排序表 |
次键(详见 特殊表技术)
- NW 7.0 EhP2 起可用
- 独立于主键定义
- 可以是 SORTED(唯一/非唯一)或 HASHED(唯一)
键访问方法
READ TABLE WITH TABLE KEY
1 | " 标准表:线性搜索(大表较慢) |
WITH TABLE KEY:使用表的主键(或次键)- 根据表类型自动优化
READ TABLE WITH KEY
1 | " 通用键搜索 - 始终线性搜索,即使在排序/哈希表上! |
⚠️
WITH KEY(不带 TABLE)始终执行线性搜索,即使在排序或哈希表上也是如此。只有 WITH TABLE KEY 使用优化的访问方法。索引访问方法
1 | +-------------------+-----------------------------+-------------------+ |
1 | " 索引读取 |
选择正确的表类型
1 | 主要访问模式是什么? |
| 场景 | 推荐类型 | 原因 |
|---|---|---|
| 按键查找单条记录 | 哈希表 | O(1) 访问 |
| 按键顺序处理记录 | 排序表 | 始终排序,二分搜索 |
| 收集后排序 | 标准表 | APPEND 快,按需 SORT |
| 部分范围读取(键边界) | 排序表 | 二分搜索 + 顺序 |
| 临时无序存储 | 标准表 | 最简单,最灵活 |
| 按键计数/聚合 | 哈希表 + COLLECT | 唯一键确保正确聚合 |
表类型声明示例
1 | " 标准表 |
键访问性能汇总
1 | 表类型 WITH TABLE KEY WITH KEY INDEX |
💡按主键搜索时始终使用
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 维护排序(排序/哈希) |
| “标准键组件” | 行类型中所有平坦的非数值字段 |
相关笔记
- 特殊表技术
- 算术表达式
- 字符串处理与正则表达式
- 数据引用与字段符号
- [[_posts/SAP_MM/SCM500_采购流程/00-仪表盘/考试陷阱]] - 内表陷阱部分
- [[_posts/SAP_MM/SCM500_采购流程/00-仪表盘/快速参考]] - 内表类型部分