背景
之前测试关于cluster table的文章如下:
create table进阶学习系列(十一)之cluster
http://blog.itpub.net/9240380/viewspace-753248/
create table进阶学习系列(十一)之cluster_续(二)
http://blog.itpub.net/9240380/viewspace-753249/
结论
1,cluster table也是表,它和普通表,在数据块中存储格式差不多
2,cluster table与普通表在数据块中存储的区别有:
仅是ITL下面的内容有区别,具体分析如下:
*** 2015-11-01 20:29:16.015
flag=-------K ,经对比,这里和普通表的不一样,普通表是 flag=--------
ntab=3 --和普通表不一样,普通表是 ntab=1
nrow=3 --同上
frre=-1
fsbo=0x20
fseo=0x1f74
avsp=0x1f4e
tosp=0x1f4e
0xe:pti[0] nrow=1 offs=0 --普通表仅有1条这样的记录,而cluster table有3条,我想是因为有2个表及cluster table本身
0x12:pti[1] nrow=1 offs=1
0x16:pti[2] nrow=1 offs=2
0x1a:pri[0] offs=0x1f82 --这里我估计是指向表的第一条记录的内存地址,也是有3条
0x1c:pri[1] offs=0x1f7b --同上
0x1e:pri[2] offs=0x1f74 --同上
block_row_dump:
tab 0, row 0, @0x1f82 --对应上述的近接的3条记录,即指向cluster table及所属table第1条记录的内存地址
tl: 22 fb: K-H-FL-- lb: 0x0 cc: 1 --
curc: 2 comc: 2 pk: 0x0101885e.0 nk: 0x0101885e.0 --这个和普通表不同,普通表没有这条记录
col 0: [ 2] c1 02 --这个我估计是cluster table的键列
tab 1, row 0, @0x1f7b --这个我估计是child_1
tl: 7 fb: -CH-FL-- lb: 0x2 cc: 1 cki: 0
col 0: [ 2] c1 02
tab 2, row 0, @0x1f74 --这个我估计是child_2
tl: 7 fb: -CH-FL-- lb: 0x2 cc: 1 cki: 0
col 0: [ 2] c1 02
end_of_block_dump
所以我总结:cluster table存储会把它自己以及所属的table全当作table来存储,所在导致ntab的值为3,而非原来的1,
nrows=3
指向表的首条记录的地址,也有3条,而非1条
行记录也有同理,也是对应起以tab 对应
同时,其在行记录这块,多了一条记录(其在普通表是没有的),curc: 2 comc: 2 pk: 0x0101885e.0 nk: 0x0101885e.0 --这个和普通表不同,普通表没有这条记录 ,关于这个含义我还要研究
测试
1,数据库版本
SQL> select * from v$version where rownum=1;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
2,创建cluster table
SQL> create cluster my_cluster(a int);
Cluster created.
创建隶属于cluster table的表
SQL> create table child_1(a int,b int) cluster my_cluster(a);
Table created.
SQL> create table child_2(a int,b int) cluster my_cluster(a);
Table created.
要向集群表中的表插入数据,先要为cluster table创建索引
SQL> insert into child_1 values(1,1);
insert into child_1 values(1,1)
*
ERROR at line 1:
ORA-02032: clustered tables cannot be used before the cluster index is built
SQL> create index idx_cluster on cluster my_cluster;
Index created.
SQL> insert into child_1 values(1,1);
1 row created.
SQL> insert into child_2 values(1,1);
1 row created.
SQL> commit;
Commit complete.
SQL> select * from child_1;
A B
---------- ----------
1 1
SQL> select * from child_2;
A B
---------- ----------
1 1
查询cluster table
SQL> select cluster_name from user_clusters where cluster_name='MY_CLUSTER';
CLUSTER_NAME
------------------------------------------------------------
MY_CLUSTER
查询cluster table中表的信息
SQL> select cluster_name,clu_column_name,table_name,tab_column_name from user_clu_columns where cluster_name='MY_CLUSTER';
CLUSTER_NAME CLU_COLUMN_NAME TABLE_NAME TAB_COLUMN_NAME
-------------------- ------------------------- ------------------------------ -------------------------
MY_CLUSTER A CHILD_1 A
MY_CLUSTER A CHILD_2 A
可见cluster table中的2个表存储在同一个数据块中
SQL> select DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID) file_no,DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID) block_no,dbms_rowid.rowid_row_number(rowid) record_no from child_1;
FILE_NO BLOCK_NO RECORD_NO
---------- ---------- ----------
4 100446 0
SQL> select DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID) file_no,DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID) block_no,dbms_rowid.rowid_row_number(rowid) record_no from child_2;
FILE_NO BLOCK_NO RECORD_NO
---------- ---------- ----------
4 100446 0
SQL> alter session set tracefile_identifier='cluster_test';
Session altered.
SQL> alter system dump datafile 4 block 100446;
System altered.
经过对比普通表的数据块结构,分析如下:
Block dump from disk:
buffer tsn: 4 rdba: 0x0101885e (4/100446)
scn: 0x0000.042af1fc seq: 0x03 flg: 0x06 tail: 0xf1fc0603
frmt: 0x02 chkval: 0x0615 type: 0x06=trans data
Hex dump of block: st=0, typ_found=1
*** 2015-11-01 20:29:15.128
Block header dump: 0x0101885e
Object id on Block? Y
seg/obj: 0x125c7 csc: 0x00.42aef0a itc: 2 flg: E typ: 1 - DATA
brn: 0 bdba: 0x1018858 ver: 0x01 opc: 0
inc: 0 exflg: 0
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x00ff.011.00001a71 0x01c0030c.064b.21 C--- 0 scn 0x0000.042aef09
0x02 0x012b.000.000017e4 0x01c0089d.058b.19 --U- 2 fsc 0x0000.042af1fc
bdba: 0x0101885e
data_block_dump,data header at 0x2b60df9ce064
===============
tsiz: 0x1f98
hsiz: 0x20
pbl: 0x2b60df9ce064
76543210
*** 2015-11-01 20:29:16.015
flag=-------K ,经对比,这里和普通表的不一样,普通表是 flag=--------
ntab=3 --和普通表不一样,普通表是 ntab=1
nrow=3 --同上
frre=-1
fsbo=0x20
fseo=0x1f74
avsp=0x1f4e
tosp=0x1f4e
0xe:pti[0] nrow=1 offs=0 --普通表仅有1条这样的记录,而cluster table有3条,我想是因为有2个表及cluster table本身
0x12:pti[1] nrow=1 offs=1
0x16:pti[2] nrow=1 offs=2
0x1a:pri[0] offs=0x1f82 --这里我估计是指向表的第一条记录的内存地址,也是有3条
0x1c:pri[1] offs=0x1f7b --同上
0x1e:pri[2] offs=0x1f74 --同上
block_row_dump:
tab 0, row 0, @0x1f82 --对应上述的近接的3条记录,即指向cluster table及所属table第1条记录的内存地址
tl: 22 fb: K-H-FL-- lb: 0x0 cc: 1 --
curc: 2 comc: 2 pk: 0x0101885e.0 nk: 0x0101885e.0 --这个和普通表不同,普通表没有这条记录
col 0: [ 2] c1 02 --这个我估计是cluster table的键列
tab 1, row 0, @0x1f7b --这个我估计是child_1
tl: 7 fb: -CH-FL-- lb: 0x2 cc: 1 cki: 0
col 0: [ 2] c1 02
tab 2, row 0, @0x1f74 --这个我估计是child_2
tl: 7 fb: -CH-FL-- lb: 0x2 cc: 1 cki: 0
col 0: [ 2] c1 02
end_of_block_dump
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/9240380/viewspace-1822699/
,如需转载,请注明出处,否则将追究法律责任。