SAP提供了三种类型的数据库表,透明表(Transparent Table),簇表(Cluster Table)和池表(Pooled Table)。其中,透明表是最常见的数据库表,其使用主要注意“Buffer”和“Index”两个方面。但对于簇表和池表,很多ABAPer并不熟悉其原理和用法。
在本篇博客中,将介绍如何在ABAP中使用簇表和池表。
1.概念解析
1.1 “簇表”和“表簇”
首先要强调的一个认知是,簇表和池表在数据库层是真实的物理存在,这也就是说簇表和池表是真实的数据库表。
在应用层SE11中定义和看到是簇表(Cluster Table)和池表(Pooled Table),在数据库层面存在的物理实体是“表簇(Table Cluser)”和“表池(Table Pool)”,也即簇表和池表并不是以独立表的形式存在的,而是以“表簇”和“表池”的存储形式存在。
下图展示了“表簇”在数据库层的存储方式。表簇是以簇表中定义的主键为Key值字段,然后通过特殊主键Pageno来确保数据的唯一性的。簇表中实际的字段内容是在Vardata字段中,通过压缩后的字符串的形式存储的。
簇表这种存储方式的优点是,簇表可以将相关的数据归集到一起,便于统一管理;并在存储过程中,通过压缩的形式存储,进行数据加密,同时节省数据空间。
但也带来了一些缺点,簇表不支持Index。当通过非主键字段访问簇表时,数据库的搜索效率是很低的。可以想象一下这个过程,数据的搜索对象是一个表簇(不仅仅是一张簇表,而是多个簇表的集合),面对的数据量是远大于真实的数据量的,通过在搜索之前,数据库还要经历解压的过程,然后在经过数据的处理和搜索。
因此,在面对簇表的数据时,首先尽可能要使用主键访问,如不能满足需求,使用簇表所对应的业务透明表进行操作。
1.2 “池表”和“表池”
与簇表的概念类似,池表和簇表的不同点在于,池表的主键包括Tabname和Varkey, 这样的话,不同的池表在表池中是以相对独立的方式存储的,但在数据的压缩程度上(压缩的数据存储在Vardata字段中),要小于簇表的效果。因此,池表面对的对象通常是数据量较小的系统表。
2. 举例
2.1 簇表BSEG和表簇RFBLG
在SE11中,可以看到这张非常著名的簇表BSEG,以及其对应的表簇RFBLG。
表簇RFBLG是众多簇表的大集合,包括BSEG,BSED, BSEC 等等。
当使用Open SQL操作簇表BSEG时,可以看到转化的Native SQL操作的对象是表簇RFBLG。
2.2 池表A001和表簇KAPOL
在SE11中,可以看到池表A001的定义,以及其对应的表池KAPOL。
表簇KAPOL是众多池表的大集合,包括A001,A004, A005 等等。与簇表类似,在Open SQL操作池表A001时,可以看到转化的Native SQL操作的对象是表池KAPOL。
3 使用备注
1. 簇表和池表不支持INDEX,JOIN, GROUP BY, ORDER BY 等类型的数据库操作( 这是由于数据的存储形式造成的 )。
2. 簇表和池表不支持DB View
3. 避免使用非主键字段检索簇表,否则对于程序性能将会造成很大的影响。应使用对应的透明表进行操作(例如:使用BSID、BSAD, BSIK、BSAK, BSIS、BSAS替代簇表BSEG )。
4. 在S/4版本上,BSEG和A001等簇表或池表已经变成的透明表,上述约束仅对ECC版本的程序。