cluster table及其屬表的table與普通表在資料塊block中儲存storage的區別

wisdomone1發表於2015-11-04

背景

   之前測試關於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部落格 ” ,連結:http://blog.itpub.net/9240380/viewspace-1822699/,如需轉載,請註明出處,否則將追究法律責任。

相關文章