1. Cluster table介绍
在ABAP中,我们经常会听到”簇表”的概念。而且,相信做过MM、FI等相关业务开发的都很熟悉BSEG这张表,也许还深有体会在这张表上去使用JOIN等传统的SQL语句居然会报错。
Cluster table是为了解决提高数据库performance而增加的一种机制,它主要是用在数据量巨大(如FI过帐等)的实体表的”替代”的情况下。它与我们传统的透明表(transparent table)相比,有着很多的区别。因为transparent table可以视为1:1的关系,而cluster table则视为n:1的关系,也就是说,它的数据是来源于多个相关的表,例如,BSEG就来源于诸如BSAD、BSID等相关透明表。
简单的结构可以以下列图表表示:
Cluster table在数据库层也是不具有实体的。如果非要说实体,那么应该叫table cluster,也就是说,数据库层是table cluster,它对应于多个在ABAP层定义的cluster tables.
因此,cluster table具有如下的特性:
优点 | 缺点 |
Fewer tables and table fields * More simple Administration | Limitaions on DB functions * No native SQL * No views or ABAP Joins * No secondary indexes * No group by, order by |
Data compression * Less memory space * less network load | No table appends |
For cluster tables * Fewer database accesses | For cluster tables. * limited selection on cluster |
就以BSEG为例,看以下的cluster table:
Cluster table :
它的cluster 属性:
所以,它的table cluster:
另外,如果where-use一下这个table cluster,那么可以发现它对应着多张cluster tables:
从上面,我们可以得出cluster的原理:
Table cluster的结构为:
Field | Data type | Meaning |
CLKEY1 | * | First key field |
CLKEY2 | * | Second key field |
… | … | … |
CLKEYn | * | nth key field |
Pageno | INT2(5) | Number of the continuation record |
Timestamp | CHAR(14) | Time stamps |
Pagelg | INT2(5) | Length of the string in Vardata |
Vardata | RAW (n) | Contains the entries from the data fields of the assigned cluster tables as a string, max. length n depends on the database system used |
例如:
Cluster table TAB1中的记录 A B C D(前两列为key,所以A,B是key fields) Cluster table TAB2中的记录 A B E F G (前三列是key,A,B,E是key fields) A B H I J (前三列是key,A,B,H是key fields 最后形成table cluster: TAB12中的数据 其中共同的key为A B,所以tab12中的cluster key是A B A B 0 .(Timestamp, pagelg等)..(description of VARDATA) C D E F A B 1 .(Timestamp, pagelg等)..(description of VARDATA) G H I J 图例: 注意: Cluster table中non-key fields的信息是保存在VARDATA中的。而vardata是有长度的,如果需要保存的数据超过了这个vardata,那么它将会产生新的”一行”/Overflow record。通过page No来确保数据行的唯一性的。 另外,timestamp和pagelg等包含了administrative information. |
更多可以参考:
help.sap.com/saphelp_nw04/helpdata/en/cf/21f083446011d189700000e8322d00/content.htm
2. Cluster table使用
下面的实例中,创建一个table cluster然后将其应用于cluster table.
(1)创建Table Cluster
Tcode: SE11
使用menu: Utilities –> Other Dictionary Objects
点击create:
系统会自动生产table cluster的结构,这里我在key field上加了一个mandt Client的字段。
然后激活.
(注:这里也可以对其进行techinical setting:Goto –>Techinical setting;但这里只能设置size category,其他的设置都是系统自带的 。)
(2)创建Cluster Table
这里,只创建一个cluster table。
Tcode: SE11。与创建transparent table一样的步骤,只是在创建时,进行change它的category:
然后选为cluster table,最后,cluster table为如下:
属性:
它的fields:
注意:这里的key fields一定要与刚创建的table cluster相区别。
然后作为测试,添加几条测试数据:
(注:这里是仅做测试,所以,该cluster table的数据是自己手动通过SE16添加的。但实际情况下,cluster table的背后是多张transparent table,所以它们的数据来源于这些tranparent table。这里仅做测试,该cluster table并没有设定其背后对应的transparent table。)
(3)测试在ABAP SQL中使用Cluster table
测试程序:
*&———————————————————————* REPORT ZTEST_CLUSTER_TABLE_1. * data *start write:/10 ‘MANDT’, 30 ‘VARKEY’, clear:ls_ZCLU_T_1. uline /(80). *1. Retrive data using Non Key-Fields |
程序很简单,仅是从cluster table ZCLU_T_1 中读取一条相同的数据,但使用的条件是不同的:一种是在SQL中使用Key fields来检索,另一种是使用在SQL非key fields来检索数据库。
执行效果:
同时,在执行该程序时,使用ST05来trace该程序的执行(关于ST05可以查阅【Performance】关于performance ):
可以看出,第二条明显比第一条发的时间要长.
同时,看summary(Trace list–> Summary trace list by SQL statement)
(使用了key-field的只读取出一条;而没有使用key-field的却是将整个cluster table读取、共5条)
如果使用expain SQL:
第一条件SQL explain:
第二条的SQL Explain:
从上面的对比可以知道:
- 数据库(Database interface)在处理ABAP SQL中的cluster table时,会自动生成对table cluster的读取。
- 在对cluster table进行操作的SQL语句中,使用非key-fields做where、order by等,是没有意义的。Database interface并不会将它们传递给Database.
所以,在现实情况下,尽量避免使用全部非non-key fields的对cluster table的检索。如果我们一定要使用non-key fields对cluster table进行,那么我们可以不使用cluster table,取而代之是找到该cluster table背后的transparent table,从而使用这些non-key fields对transparent table进行读取(虽说不一定很好的performance,但至少不是上面使用cluster table时DB interface采用的all client range scan,可能是index range scan等 ),从而提高performance。
(4)测试对Cluster table使用 JOIN
测试程序:
其中,zclu_t_2是与zclu_t_1形成了外键关系.
对于cluster table是不能使用JOIN的。