二维码

[ddic] 池表Pool Table与簇表Cluster Table两者区别解析

Twilight发表于 2014-03-27 21:34Twilight 最后回复于 2014-03-27 21:34 [复制链接] 13003 0

一、 池表与簇表
1. 介绍
数据库表视角.jpg
图-1 数据库表视角
除了透明表外,SAP 系统还能够在ABAP 字典中以相同的方法定义数据库级别上的池表和簇表。池表和簇表都是把ABAP字典中逻辑定义的多个表分组合并到一个物理的数据库表。
什么是簇表?我们可以很直观的理解为,在 DATABASE (数据层),除了我们定义的主键, 然后把其他的内容都当成表格的一个字段存起来。 也就是说这个表的结构可以理解为: 主键 + 一个存储功能的字段的组合。 然而在其中还会有 PAGENO 的这个字段,这就是说,一行空间不够(32KB)用,在主键相通 的情况下,继续细分,用来将属于一个主键的内容联系起来的字段 1、2、3。
表簇,是该表在 DATABASE 的存储结构, 簇表,是该表在 SAP DICTIONARY 展现在我们眼前的结构。 于是我们就会知道为什么我们不能用 NATIVE SQL 去访问 这个簇表了。因为我们在 SAP 中的看到的字段,在 DATABASE 是不存在的,是通过转化的才显示在我们 SAP DICTINARY 中的结构。

2. 优点和缺点
  • 池表和簇表的优点是它们的数据都在数据库以压缩形式存储。因此减少了需要的内存空间和网络负荷。
  • 把表分组在表池和表簇中减少了表的数量,因此压缩了数据库中字段的数量。结果是可以执行较少的不同 SQL 语句。
  • 池表和簇表在数据库中不作为独立的表创建。因此管理变得比较容易。对于簇表,功能上互相依赖的数据 被一起读取,因此减少了数据库访问的数量。
  • 池表和簇表的缺点是数据库功能受到限制。不能对非键字段创建索引。可以创建主键索引或对键字段的子 集创建索引。此外,还不能使用数据库视图、ABAP JOIN 或者表追加。池表或者簇表中的数据只能使用OPEN SQL 访问。不能使用Native SQL 访问。
  • 对于池表,只有对键字段的WHERE 条件被传递给数据库。对于簇表,只有簇键中字段(键字段的子集) 的WHERE 条件被传递给数据库。对非键字段的ORDER BY 或GROUP BY 子句都不会被传输。对于池表需要比语义需要更长的键。


3. 簇表的访问
簇表的存储结构示意图.jpg
图-2 簇表的存储结构示意图
  • 在簇表中,功能上互相依赖的数据被分布在几个表, 并被分组合并到同一个数据库表。簇表中键字段的交叉部分组成了表簇的键(簇键)。
  • 依赖于簇键的数据存储在表簇的VARDATA 字段。如果VARDATA 字段长度无法存储所有依赖的数据,数据库接口创建一个溢出记录。字段PAGNO 确保表簇内的惟一性。
  • 数据库接口压缩了VARDATA 字段的内容。VARDATA 字段包含了对于如何压缩它的数据的描述。字段TIMESTAMP 和PAGELG 包含了管理信息。

对簇表的可选择访问.jpg
图-3 对簇表的可选择访问
  • 在上面例子中,数据从簇表BSEG 中读出。SQL 语句被传输给数据库接口,并转换成对表簇RFBLG 的SQL 语句。这个SQL 语句从簇中返回所有相应的数据记录,而不管数据记录是逻辑上包含在BSEG 还是RFBLG 中的某个其他表中。
  • 由于部分簇键中的字段在WHERE 子句中指定,相应的WHERE 条件被传输给数据库。数据库接口也结合了簇键中WHERE 子句的字段MANDT 和ORDER BY 子句中的字段。
  • 当访问簇表时,由于只能使用主键索引,需要确保WHERE 子句中的可选择字段从左边开始指定并且持续没有间隔。
  • 在例子里如果WHERE 条件的BUKRS 字段被忽略, 索引搜索串就是'001____0000000022' 的形式。这时,当SQL 语句被处理时,会读取很多索引块(查看前面单元的说明)。

对簇表的不可选择访问.jpg
图-4 对簇表的不可选择访问
  • 在上面的例子中,簇表BSEG 用字段KUNNR 的WHERE 条件访问,它被压缩在VARDATA 字段中。数据库接口不会把字段KUNNR 的WHERE 条件传输给数据库。
  • 相对的,所有登录客户端的数据记录都从表簇RFBLG 中读出。这意味着逻辑上不包含在BSEG 中的数据记录也被读出。数据库接口为字段KUNNR 比较WHERE 字句。
  • 相对的,可以使用二级索引来访问数据。二级索引是透明表,数据可以冗余存储便于访问。在例子中,所 需的信息可以从透明表BSID 中获得(应收帐户的二级索引)。
  • 如果SAP 不支持其他访问路径,可以从表簇中移除这个表。然而,必须在此之前咨询SAP(SAP Notes 或支持)。

4. 池表的访问
池表存储来自ABAP 字典中定义的表达数据记录。表互相不依赖。小的SAP 表被分组合并到一起形成一个数据库表。
池表的存储结构示意图.jpg
图-5 池表的存储结构示意图
  • 上面例子展示了没有相同键字段的表TABA 和TABB。来自TABA 和TABB 的数据记录都在TABAB 中。
  • 对于表池TABAB 中数据记录的键由两个字段组成, TABNAME 和VARKEY。字段TABNAME 区分池表的名字。字段VARKEY 由池表中的键字段连接组成。因此,池表中的键字段必须是类型为C。
  • 数据库接口把池表的非键字段存储在VARDATA 字段中。它们以压缩的形式无结构存储。字段DATALN 存储了VARDATA 字段的长度。

对池表的可选择访问.jpg
图-6 对池表的可选择访问
  • 在上面例子中,数据从池表AA005 读出。SQL 语句被传输给数据库接口,并且转换成对池表KAPOL 的SQL 语句。
  • SQL 语句中的WHERE 字句中指定的WHERE 条件引用了表AA005 的键字段,并因此传输给数据库的VARKEY 字段。数据库接口为字段TABNAME 和VARKEY(表池的键字段)合并了ORDER BY 子句。

对池表的不可选择访问.jpg
图-7 对池表的不可选择访问
  • 对于池表的SQL 语句必须用WHERE 条件指定带等号的键字段。键字段必须从表的左起的键字段开始指 定。此外,指定的键字段必须严格连续,就是说,指 定字段顺序中不能存在空缺。在例子中,没有为 KUNNR 字段指定WHERE 条件。数据库因此就使用索引查询串:'AA005001__0000000023473'。
  • 数据库使用部分串'AA005001%'。这意味着会读取过多的数据块。
  • 要解决这个问题,首先检查是否能够指定缺少的WHERE 条件。如果不可能,就检查是否能够修改SAP 表缓存。
  • 如果无法修改SAP 表缓存,可以把表从表池中移出并且转换成透明表。然后为指定字段创建二级索引以确 保对数据库的有效访问。

二、 创建一个簇表
簇表都是由透明表转化成的,要创建簇表,首先就要创建一个透明表,这个透明表的显示结构,就是我们想想在簇表中显示的结构,然后在 SE11 进去看观看此透明表状态并且处于修改状态,点击 Extras -> Change Table Category. 选最后一个 (RADIO BUTTON) 复制簇表的选项,是个小对勾,这个点完了,系统会自动跳到 SE11 的界面,好像什么也没有发生。这时候我们去 DELIVERY AND MAINTENANCE 标签下面看,就会出现了一个 POOL/CLUSTER 的文本框,填入我们创建的表簇。激活保存就搞定了。
簇表创建步骤.jpg
图8-1簇表创建步骤
簇表创建步骤2.jpg
图8-2簇表创建步骤
簇表创建步骤3.jpg
图8-3 簇表创建步骤

注意,这里我们要在表簇中手工将 VARKEY删掉,换成我们表的要显示的主键,比如MATNR,表簇主键为我要显示主键的子集,再添加一个mandt集团 关键字 char 3。 而表簇创建后激活就可以了。然后进入透明表 CHANGE TABLE CATEGORY 中点第三个 么再进去 DELIVERY AND MAINTENANCE 中 填入表簇,激活。 池表和簇表的创建过程相同。 但是池表和簇表还是有区别的。 INSERT 透明表 INTO 簇表。 只要透明的簇表的主键都在透明表里面就行。就是透明表 主键多了也无所谓。 INSERT 透明表 INTO 池表. 透明表和池表的主键必须相同的。

三、 簇表与池表的数据写入
  1. TABLES: zdamon03,zdamon05,zdamon06.
  2. zdamon03-matnr = '000000000101000450'.
  3. zdamon03-bezei = '簇表更新测试450'.
  4. INSERT INTO zdamon03 VALUES zdamon03.

  5. zdamon05-matnr = '000000000101000451'.
  6. zdamon05-bezei1 = '簇表更新测试451'.
  7. INSERT INTO zdamon05 VALUES zdamon05.

  8. zdamon06-matnr = '000000000101000452'.
  9. zdamon06-bezei1 = '池表更新测试451'.
  10. INSERT INTO zdamon06 VALUES zdamon06.

  11. COMMIT WORK.
复制代码

四、 簇表与池表的SQL解析
在ABAP代码中,我们可以使用受限制的OPEN SQL来访问簇表与池表,受限制的功能有INNER、SUM、GROUP BY等等需要在数据库上完成的语句都被限制了。 SQL语句的解析: SELECT SINGLE * FROM ZLIAP05语句的SQL解析为
SQL簇表的解析.jpg
图-9 SQL簇表的解析

SELECT SINGLE * FROM ZLIAP06语句的SQL解析为
池表的解析2.jpg
图-10 池表的解析

从上面两个图可以看到,解析后的SQL语句中是不存在ZLIAP05与ZLIAP06表的,它们在数据库层也不是实际存在的表。
回复

使用道具 举报

快速回帖

本版积分规则
您需要登录后才可以回帖 登录 | 注册有礼

快速回复 返回顶部 返回列表