索引与表缓冲 (★★★★)
#abap #abap-dictionary #abap-performance
概览表
| Technique (技术) |
Purpose (目的) |
Impact (影响) |
| Primary Index (主索引) |
键字段排序查找 |
自动创建 |
| Secondary Index (二级索引) |
非键字段加速 |
需手动创建 |
| Full Buffering (完全缓冲) |
全表加载到内存 |
小表、读频繁 |
| Generic Buffering (通用缓冲) |
按键前缀加载 |
分组访问 |
| Single-record Buffering (单记录) |
仅加载访问的记录 |
大表、随机访问 |
索引 (Indexes)
结构
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| Index (索引) = 排序的字段子集 + 指向原表的指针
Table: SPFLI ┌────────┬────────┬──────────┬───────────┐ │ CARRID │ CONNID │ CITYFROM │ CITYTO │ ← 原表 ├────────┼────────┼──────────┼───────────┤ │ AA │ 0017 │ NEW YORK │ SAN FRAN │ │ LH │ 0400 │ FRANKFURT│ NEW YORK │ └────────┴────────┴──────────┴───────────┘
Secondary Index A11 (CITYFROM, CITYTO): ┌──────────┬───────────┬────────┐ │ CITYFROM │ CITYTO │ → PTR │ ← 索引(排序存储) ├──────────┼───────────┼────────┤ │ FRANKFURT│ NEW YORK │ Row 2 │ │ NEW YORK │ SAN FRAN │ Row 1 │ └──────────┴───────────┴────────┘
|
索引类型
| Type |
ID |
Description |
| Primary Index |
0 |
键字段,自动创建 |
| Secondary Index |
Y/Z 开头 |
客户创建 |
| Unique Index |
— |
索引字段唯一标识记录 |
索引使用规则
- 索引只能使用到最后一个在 WHERE 中指定的字段
- 跳过中间字段 → 后续字段无法使用索引
- WHERE 中出现频率高的字段应放在前面
- 只有显著减少数据量的字段才有意义加入索引
创建索引注意事项
| 考虑因素 |
建议 |
| 字段顺序 |
高频 WHERE 字段在前 |
| 字段数量 |
选择区分度高的字段 |
| 表修改频率 |
频繁修改的表不要太多索引 |
| 索引互斥性 |
同一表的索引尽量不相交 |
| 数据库特定 |
可指定只在特定 DB 上创建 |
| 唯一性 |
如有键功能,设为 Unique Index |
每次修改表数据都需调整索引排序。频繁修改的表应控制索引数量。
表缓冲 (Table Buffering)
缓冲将表数据加载到应用服务器的本地内存中,性能提升 10-100 倍。
缓冲类型对比
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| 完全缓冲 (Full): 触发: 访问任一记录 加载: 全表所有记录 适用: ≤10,000 条,读频繁,很少修改
通用缓冲 (Generic): 触发: 访问某记录 加载: 同一左键前缀的所有记录 适用: 按键前缀分组访问
单记录缓冲 (Single-record): 触发: 访问某记录 加载: 仅该条记录 适用: 大表、随机访问
|
缓冲同步机制
1 2 3 4 5 6 7
| App Server A (Buffer) Database ├── Table T records ←→ Table T ├── 读取: 直接从缓冲 ↓ 修改 └── 命中: 快速返回 同步通知 ↓ App Server B (Buffer) 其他服务器缓冲失效 └── 失效后重新加载
|
- 数据修改时,所有应用服务器的缓冲被标记失效
- 失效后的第一次访问需要从数据库重新加载
- 同步是异步执行的
/$TAB 命令重置表缓冲——仅在出现不一致时使用
大型系统重置后需数小时重新填充,期间性能大幅下降
缓冲建议
| 场景 |
建议 |
| 读多写少,数据量小 |
完全缓冲 |
| 按键前缀分组读 |
通用缓冲 |
| 大表随机读 |
单记录缓冲 |
| 频繁修改 |
不缓冲 |
| 实时性要求高 |
不缓冲 |
考试/测试模式
| Scenario/Keyword (场景/关键词) |
Answer (答案) |
| “索引使用到哪个字段?” |
最后一个在 WHERE 中指定的字段 |
| “二级索引 ID 命名?” |
客户创建以 Y 或 Z 开头 |
| “完全缓冲触发条件?” |
访问任一记录时加载全表 |
| “缓冲能提升多少性能?” |
10 到 100 倍 |
| “/$TAB 命令用途?” |
重置表缓冲(仅修复不一致) |