特殊 SAP 表 — 池表与簇表 (★★★)

特殊 SAP 表 — 池表与簇表 (★★★)

#abap #abap-dictionary #abap-tables

概览表

Feature (特性) Transparent (透明表) Pooled (池表) Cluster (簇表)
DB 中独立存在
存储方式 独立表 多表合并到表池 多表合并到表簇
数据压缩 是(非键字段) 是(全部数据)
可建索引 主键+二级索引 仅键字段 仅簇键
JOIN / View 支持 不支持 不支持
Table Append 支持 不支持 不支持
SQL 限制 仅 Open SQL 仅 Open SQL

池表 (Pooled Tables)

多个逻辑表存储在一个表池 (Table Pool) 中。

1
2
3
4
5
6
7
8
9
Dictionary:           Database:
┌─────┐ ┌─────────────────────────────────────┐
│TABA │──┐ │ TABAB (Table Pool) │
│ │ │ │─────────────────────────────────────│
├─────┤ ├──→ │ TABNAME │ VARKEY │ VARDATA │ DATALN │
│TABB │──┘ │─────────────────────────────────────│
└─────┘ │ TABA │ key1 │ data... │ len │
│ TABB │ key2 │ data... │ len │
└─────────────────────────────────────┘
  • TABNAME: 池表名称
  • VARKEY: 池表键字段的拼接(所以键字段必须是 C 类型)
  • VARDATA: 非键字段的压缩数据
  • DATALN: VARDATA 的长度
📌池表特点
  • 各池表之间无功能依赖(只是合并小表)
  • 键字段的交集可能为空
  • 键字段必须是 C 类型(字符型)

簇表 (Cluster Tables)

功能相关的数据存储在一个表簇 (Table Cluster) 中。

1
2
3
4
5
6
7
8
Dictionary:           Database:
┌─────┐ ┌───────────────────────────────────────────────┐
│TAB1 │──┐ │ Table Cluster │
│ │ │ │───────────────────────────────────────────────│
├─────┤ ├──→ │ Cluster Key │ PAGNO │ VARDATA │ TIMEST │ PAGELG│
│TAB2 │──┘ │───────────────────────────────────────────────│
└─────┘ │ key_value │ 0 │ compressed│ │ │
└───────────────────────────────────────────────┘
  • Cluster Key: 各簇表键字段的交集
  • VARDATA: 所有依赖数据的压缩存储
  • PAGNO: 页号(溢出记录时使用)
  • 数据库接口负责压缩/解压
📌簇表特点
  • 簇表之间有功能依赖(共享簇键)
  • VARDATA 包含解压描述信息
  • 溢出时创建新页(PAGNO 递增)

优缺点

优点

  • 压缩存储:减少磁盘空间和网络负载
  • 减少表数量:合并到物理表中
  • 更少 SQL 语句:减少不同 SQL 的种类
  • 簇表的联合读取:功能相关数据一起读取,减少数据库访问

缺点

  • 索引受限:非键字段不能建索引
  • 无 JOIN/View:不能用于数据库视图或 ABAP JOIN
  • 无 Table Append:不能用 Append 结构
  • 仅 Open SQL:不能用 Native SQL
  • WHERE 限制:池表仅键字段,簇表仅簇键字段的 WHERE 传递到 DB
  • ORDER BY/GROUP BY 限制:非键字段不支持

考试/测试模式

Scenario/Keyword (场景/关键词) Answer (答案)
“池表和簇表的主要区别?” 池表无功能依赖,簇表有功能依赖(共享簇键)
“池表键字段类型限制?” 必须是 C 类型
“池表/簇表能用 JOIN 吗?” 不能
“池表/簇表能用 Append 结构吗?” 不能