ITPub博客

首页 > 数据库 > Oracle > cluster table及其属表的table与普通表在数据块block中存储storage的区别

cluster table及其属表的table与普通表在数据块block中存储storage的区别

原创 Oracle 作者:wisdomone1 时间:2015-11-04 21:20:18 0 删除 编辑

背景

   之前测试关于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/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
提供针对oracle初学者及进阶的数据库培训,欢迎大家咨询: 微信: wisdomone 微信公众号: lovedb 工作经历: 中国普天 北京科蓝 北京云和恩墨 北京神州新桥

注册时间:2008-04-04

  • 博文量
    2189
  • 访问量
    12690173