【DDIC】关于Cluster table以及Table Cluster

 

 

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等相关透明表。

简单的结构可以以下列图表表示:

112

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 :

211

它的cluster 属性:

38

所以,它的table cluster:

42

另外,如果where-use一下这个table cluster,那么可以发现它对应着多张cluster tables:

52

从上面,我们可以得出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

图例:

63

注意:

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

72

点击create:

系统会自动生产table cluster的结构,这里我在key field上加了一个mandt Client的字段。

82

然后激活.

(注:这里也可以对其进行techinical setting:Goto –>Techinical setting;但这里只能设置size category,其他的设置都是系统自带的 。)

(2)创建Cluster Table

这里,只创建一个cluster table。

Tcode: SE11。与创建transparent table一样的步骤,只是在创建时,进行change它的category:

92

然后选为cluster table,最后,cluster table为如下:

属性:

102

它的fields:

113

注意:这里的key fields一定要与刚创建的table cluster相区别。

然后作为测试,添加几条测试数据:

122

(注:这里是仅做测试,所以,该cluster table的数据是自己手动通过SE16添加的。但实际情况下,cluster table的背后是多张transparent table,所以它们的数据来源于这些tranparent table。这里仅做测试,该cluster table并没有设定其背后对应的transparent table。)

(3)测试在ABAP SQL中使用Cluster table

测试程序:

 

*&———————————————————————*
*& Report  ZTEST_CLUSTER_TABLE_1
*&
*&———————————————————————*
*& Test Cluster table
*&  Using KEY-Fields & Non-Key fields in ABAP SQL
*&———————————————————————*

REPORT ZTEST_CLUSTER_TABLE_1.

* data
DATA:
ls_ZCLU_T_1 type ZCLU_T_1,
lt_ZCLU_T_1 type TABLE OF ZCLU_T_1.

*start
START-OF-SELECTION.

write:/10 ‘MANDT’, 30 ‘VARKEY’,
40 ‘NAME’, 60 ‘ADDRESS’.
uline /(80).
*1. Retrive data using Key-Fields
write:/ ‘Retrive data using Key-Fields’.
SELECT * from ZCLU_T_1 into table lt_ZCLU_T_1
where VARKEY = ‘1001′.
LOOP AT lt_ZCLU_T_1 into ls_ZCLU_T_1 .
write:/10 ls_ZCLU_T_1-MANDT,
30 ls_ZCLU_T_1-VARKEY,
40 ls_ZCLU_T_1-NAME,
60 ls_ZCLU_T_1-ADDRESS.
ENDLOOP.

clear:ls_ZCLU_T_1.
REFRESH:lt_ZCLU_T_1.

uline /(80).

*1. Retrive data using Non Key-Fields
write:/ ‘Retrive data using Non Key-Fields’.
SELECT * from ZCLU_T_1 into table lt_ZCLU_T_1
where NAME = ‘CCD 1001′.
LOOP AT lt_ZCLU_T_1 into ls_ZCLU_T_1 .
write:/10 ls_ZCLU_T_1-MANDT,
30 ls_ZCLU_T_1-VARKEY,
40 ls_ZCLU_T_1-NAME,
60 ls_ZCLU_T_1-ADDRESS.
ENDLOOP.

程序很简单,仅是从cluster table ZCLU_T_1  中读取一条相同的数据,但使用的条件是不同的:一种是在SQL中使用Key fields来检索,另一种是使用在SQL非key fields来检索数据库。

执行效果:

132

同时,在执行该程序时,使用ST05来trace该程序的执行(关于ST05可以查阅【Performance】关于performance ):

142

可以看出,第二条明显比第一条发的时间要长.

同时,看summary(Trace list–> Summary trace list by SQL statement)

152

(使用了key-field的只读取出一条;而没有使用key-field的却是将整个cluster table读取、共5条)

如果使用expain SQL:

第一条件SQL explain:

162

第二条的SQL Explain:

172

从上面的对比可以知道:

  • 数据库(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

测试程序:

182

其中,zclu_t_2是与zclu_t_1形成了外键关系.

对于cluster table是不能使用JOIN的。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值