索引与表缓冲 (★★★★)

索引与表缓冲 (★★★★)

#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 索引字段唯一标识记录

索引使用规则

📌索引使用条件
  1. 索引只能使用到最后一个在 WHERE 中指定的字段
  2. 跳过中间字段 → 后续字段无法使用索引
  3. WHERE 中出现频率高的字段应放在前面
  4. 只有显著减少数据量的字段才有意义加入索引

创建索引注意事项

考虑因素 建议
字段顺序 高频 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 命令用途?” 重置表缓冲(仅修复不一致)