cluster table及其屬表的table與普通表在資料塊block中儲存storage的區別
背景
之前測試關於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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 達夢列儲存表(HUGE Table)
- oracle動態sql執行table表中儲存的sqlOracleSQL
- 內表(internal table)和工作區(work area)的區別
- oracle中用Create Table建立表時,Storage中引數的含義!Oracle
- 資料庫表--nested table資料庫
- 資料庫表--temporary table資料庫
- 資料庫表--object table資料庫Object
- 資料庫表--external table資料庫
- 在儲存過程中寫truncate table儲存過程
- table move 與 shrink 的區別
- 【實驗】【聚簇】聚簇(Cluster)和聚簇表(Cluster Table)的建立與總結
- drop table和truncate table的區別
- 資料庫表--heap organized table資料庫Zed
- 資料庫表--index organized table資料庫IndexZed
- 資料庫表--index clustered table資料庫Index
- 資料庫表--hash clustered table資料庫
- 表在表空間中的儲存情況
- MySQL的create table as 與 like區別MySql
- 【轉】dbms_stats.gather_table_stats與analyze table 的區別
- PostgreSQL:表的儲存屬性SQL
- 【Azure 儲存服務】Python模組(azure.cosmosdb.table)直接對錶儲存(Storage Account Table)做操作示例Python
- 【移動資料】External Table 外部表
- 資料庫表--sorted hash clustered table資料庫
- Oracle 12.2使用dbms_redefinition.redef_table過程來重定義表的儲存屬性Oracle
- javascript: 帶分組資料的Table表頭排序JavaScript排序
- 恢復被執行truncate table的表資料
- dbms_stats.gather_table_stats與analyze table 的區別[轉貼]
- alter table move 與shrink space的區別
- alter table table_name move ; 在自身表空間move是如何操作的?
- alter table move 和 alter table shrink space的區別
- table中cesllspacing與cellpadding的區別詳解padding
- dual表與create table語句的關係
- Block型別及儲存區域BloC型別
- jwt 自定義 資料表 區別於 auth 中的 users 表JWT
- Azure Storage 系列(五)通過Azure.Cosmos.Table 類庫在.Net 上使用 Table Storage
- css中display設定為table、table-row、table-cell後的作用及其注意點CSS
- Oracle 普通table 轉換為partition tableOracle
- 【資料結構與演算法學習】雜湊表(Hash Table,雜湊表)資料結構演算法