資料塊中的極限1(transaction)
資料塊中的極限1——transaction
冰凍奶茶
一前言
在oracle中關於表的許多屬性值都是有限制的,而這些限制很多都是由於data block中的相應屬性的表達方式造成的。下面我們研究一下表上的transaction的限制。
[@more@]資料塊中的極限1——transaction
冰凍奶茶
一前言
在oracle中關於表的許多屬性值都是有限制的,而這些限制很多都是由於data block中的相應屬性的表達方式造成的。下面我們研究一下表上的transaction的限制。
SQL> create table mytest
2 (id varchar2(3))
3 initrans 1
4 maxtrans 255;
Table created
SQL> insert into mytest values ('a');
1 row inserted
SQL> commit;
Commit complete
SQL> set serveroutput on
SQL> exec show_space('MYTEST');
Free Blocks.............................1
Total Blocks............................8
Total Bytes.............................65536
Unused Blocks...........................6
Unused Bytes............................49152
Last Used Ext FileId....................11
Last Used Ext BlockId...................41
Last Used Block.........................2
PL/SQL procedure successfully completed
SQL> alter system dump datafile 11 block 42;
System altered
查詢udump路徑下,找到該trace檔案:
*** 2006-06-16 22:01:33.390
*** SESSION ID:(12.24) 2006-06-16 22:01:33.125
Start dump data blocks tsn: 12 file#: 11 minblk 42 maxblk 42
buffer tsn: 12 rdba: 0x02c0002a (11/42)
scn: 0x0000.0f331f36 seq: 0x01 flg: 0x02 tail: 0x1f360601
frmt: 0x02 chkval: 0x0000 type: 0x06=trans data
Block header dump: 0x02c0002a
Object id on Block? Y
seg/obj: 0xbea7 csc: 0x00.f331f34 itc: 2 flg: O typ: 1 - DATA
fsl: 0 fnx: 0x0 ver: 0x01
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0002.00f.00004407 0x00801136.02a3.1b --U- 1 fsc 0x0000.0f331f36
0x02 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
data_block_dump,data header at 0x4f6305c
===============
tsiz: 0x1fa0
hsiz: 0x14
pbl: 0x04f6305c
bdba: 0x02c0002a
76543210
flag=--------
ntab=1
nrow=1
frre=-1
fsbo=0x14
fseo=0x1f9b
avsp=0x1f83
tosp=0x1f83
0xe:pti[0] nrow=1 offs=0
0x12:pri[0] offs=0x1f9b
block_row_dump:
tab 0, row 0, @0x1f9b
tl: 5 fb: --H-FL-- lb: 0x1 cc: 1
col 0: [ 1] 61
end_of_block_dump
End dump data blocks tsn: 12 file#: 11 minblk 42 maxblk 42
二transaction的上限
從這個dump的結果可以看到Itl這個屬性值,他代表事務列的序號。從他的格式可以看出來,Itl這個引數的最大值為0xff,即255。也就是一個資料表上的initrans和maxtrans引數的最大值為255,同時操作一個表的事務上限為255。
例一
SQL>
create table mytest_1
(id varchar2(10))
initrans 256
maxtrans 256
ORA-02207: 無效的 INITRANS 選項值
SQL>
create table mytest_1
(id varchar2(10))
initrans 1
maxtrans 256
ORA-02209: 無效的 MAXTRANS 選項值
從上面的測試結果可以看出,資料表上的initrans和maxtrans引數的上限果然是255。
三transaction的空間佔用
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0002.00f.00004407 0x00801136.02a3.1b --U- 1 fsc 0x0000.0f331f36
0x02 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
為事物列表在資料塊中的儲存結果,可以看到他會佔用一定的空間,那麼可以推斷到transaction的個數越多,那麼他在data block中佔用的空間就會越多,data block用來儲存表中記錄的空間也會相應的減少。
例二
SQL> show parameter block_size
NAME TYPE VALUE
------------------------------------ ---------------------- -----------------------------------------------
db_block_size integer 8192
QL> create table mytest_1
2 (id varchar2(10))
3 initrans 1
4 maxtrans 1;
Table created
SQL> insert into mytest_1 values ('b');
1 row inserted
SQL> commit;
Commit complete
SQL> set serveroutput on
SQL> exec show_space('MYTEST_1');
Free Blocks.............................1
Total Blocks............................8
Total Bytes.............................65536
Unused Blocks...........................6
Unused Bytes............................49152
Last Used Ext FileId....................11
Last Used Ext BlockId...................49
Last Used Block.........................2
PL/SQL procedure successfully completed
SQL> alter system dump datafile 11 block 50;
System altered
*** 2006-06-16 22:25:03.750
Start dump data blocks tsn: 12 file#: 11 minblk 50 maxblk 50
buffer tsn: 12 rdba: 0x02c00032 (11/50)
scn: 0x0000.0f332d2d seq: 0x01 flg: 0x02 tail: 0x2d2d0601
frmt: 0x02 chkval: 0x0000 type: 0x06=trans data
Block header dump: 0x02c00032
Object id on Block? Y
seg/obj: 0xbea8 csc: 0x00.f332d2b itc: 2 flg: O typ: 1 - DATA
fsl: 0 fnx: 0x0 ver: 0x01
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0010.029.00000005 0x008000e4.0001.49 --U- 1 fsc 0x0000.0f332d2d
0x02 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
data_block_dump,data header at 0x4cf305c
===============
tsiz: 0x1fa0
hsiz: 0x14
pbl: 0x04cf305c
bdba: 0x02c00032
76543210
flag=--------
ntab=1
nrow=1
frre=-1
fsbo=0x14
fseo=0x1f9b
avsp=0x1f83
tosp=0x1f83
0xe:pti[0] nrow=1 offs=0
0x12:pri[0] offs=0x1f9b
block_row_dump:
tab 0, row 0, @0x1f9b
tl: 5 fb: --H-FL-- lb: 0x1 cc: 1
col 0: [ 1] 62
end_of_block_dump
End dump data blocks tsn: 12 file#: 11 minblk 50 maxblk 50
Dump結果中的avsp欄位的值為data block中的可用空間數量,單位為位元組。可以看到當表上事務為1的時候,可以空間為8067位元組
SQL> select to_number('1f83','xxxxxxx') from dual;
TO_NUMBER('1F83','XXXXXXX')
---------------------------
8067
例三
SQL> create table mytest_2
2 (id varchar2(10))
3 initrans 255
4 maxtrans 255;
Table created
SQL> insert into mytest_2 values ('b');
1 row inserted
SQL> commit;
Commit complete
SQL> exec show_space('MYTEST_2');
Free Blocks.............................1
Total Blocks............................8
Total Bytes.............................65536
Unused Blocks...........................6
Unused Bytes............................49152
Last Used Ext FileId....................11
Last Used Ext BlockId...................57
Last Used Block.........................2
PL/SQL procedure successfully completed
SQL> alter system dump datafile 11 block 58;
System altered
*** 2006-06-16 22:30:18.140
Start dump data blocks tsn: 12 file#: 11 minblk 58 maxblk 58
buffer tsn: 12 rdba: 0x02c0003a (11/58)
scn: 0x0000.0f333100 seq: 0x01 flg: 0x02 tail: 0x31000601
frmt: 0x02 chkval: 0x0000 type: 0x06=trans data
Block header dump: 0x02c0003a
Object id on Block? Y
seg/obj: 0xbea9 csc: 0x00.f3330ff itc: 169 flg: O typ: 1 - DATA
fsl: 0 fnx: 0x0 ver: 0x01
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0006.00f.00004408 0x0080085b.0299.45 --U- 1 fsc 0x0000.0f333100
0x02 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
0x03 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
。。。。。。。。。。。。。。。。。。
0x58 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
0xa7 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
0xa8 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
0xa9 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
data_block_dump,data header at 0x4cf4004
===============
tsiz: 0xff8
hsiz: 0x14
pbl: 0x04cf4004
bdba: 0x02c0003a
76543210
flag=--------
ntab=1
nrow=1
frre=-1
fsbo=0x14
fseo=0xff3
avsp=0xfdb
tosp=0xfdb
0xe:pti[0] nrow=1 offs=0
0x12:pri[0] offs=0xff3
block_row_dump:
tab 0, row 0, @0xff3
tl: 5 fb: --H-FL-- lb: 0x1 cc: 1
col 0: [ 1] 62
end_of_block_dump
End dump data blocks tsn: 12 file#: 11 minblk 58 maxblk 58
SQL> select to_number('fdb','xxxxxxx') from dual;
TO_NUMBER('FDB','XXXXXXX')
--------------------------
4059
表mytest_2上的initrans和maxtrans設定均為255,此時可以看到資料塊中的空閒空間為4059個位元組。比事務個數為1的時候少了8067 – 4059 = 4008個位元組,事務的個數多了0xa9 – 1 = 168。從以上的結果也可以大概推算出每個事務項在data block中所佔的空間大約為24個位元組。
另外一個比較有趣的現象是,雖然我們在表mytest_2上建立的事務個數應該為255個,但實際上僅僅存在169個,為什麼會存在這麼大的差別呢,從下面的例子可以看出一點端倪。
三block size對事務個數的影響
上面的例子的結論是,在block size的情況下最大transobject為169
下面來驗證一下在其他的block size下最大的transobject個數
例四
block size = 16k
SQL> alter system set db_16k_cache_size = 4194304 scope = both;
系統已更改。
SQL> create tablespace t_16k
2 datafile 'D:oracleoradatamyoraclet_16k.dbf' size 10m
3 blocksize 16k;
表空間已建立。
SQL> create table mytest_16k
2 (id varchar2(10))
3 initrans 255
4 maxtrans 255
5 tablespace t_16k;
表已建立。
SQL> insert into mytest_16k values('a');
已建立 1 行。
SQL> commit;
由於篇幅原因結果就不貼了,僅僅把結論貼出來
當block size = 16k的時候,最大的trans的數量為255,data block中的最小空閒空間為10187位元組,空閒百分比為62.18%
當block size = 8k的時候,最大的trans的數量為169,data block中的最小空閒空間為4059位元組,空閒百分比為49.55%
當block size = 4k的時候,最大的trans的數量為83,data block中的最小空閒空間為2027位元組,空閒百分比為49.49%
當block size = 2k的時候,最大的trans的數量為41,data block中的最小空閒空間為987位元組,空閒百分比為48.19%
由此可見,oracle會在trans所佔用的空間上和data block的總空間上有一個很好的平衡,不會發生由於過多的事務導致block中的可用空間過少的情況發生。另一方面可提醒我們,要合理設定表上的trans的數量,過大或過小都會對系統產生不同程度的影響。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8394333/viewspace-987135/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 分層資料 Hierarchical Data 探索 (1.遞迴) 無限極分類遞迴
- 1 函式極限的嚴格定義函式
- 考點 1:數列極限概念
- 思考的極限
- 極限
- 通道的極限容量
- 極限limitMIT
- 極限運算中的連續性原則
- L1-067 洛希極限 分數 10
- Android資料庫TransactionAndroid資料庫
- 極限程式設計中的簡單設計原則程式設計
- Path 突破Canvas極限Canvas
- 極限程式設計程式設計
- 利用BBED修改資料塊SCN----極端環境下的資料恢復資料恢復
- flashback_transaction_query的資料來源!
- MYSQL之插入極限分析MySql
- 極限程式設計思想程式設計
- 每天都在挑戰極限...
- 極限與連續(一)
- 極限與連續(二)
- 資料庫中的域名(1)資料庫
- php無限級分類函式(無極限)PHP函式
- 極光大資料:2019年Q1中國手機市場資料大資料
- flashback_transaction_query資料保留的時間
- 4 極限的運演算法則演算法
- 不要陷入極限程式設計的陷阱程式設計
- 極限程式設計的“權利法案”程式設計
- [資料庫]--Transaction那點事兒資料庫
- 使用Flashback Transaction方法來恢復資料表資料
- 遠離極限程式設計程式設計
- 利用定積分求極限
- 用bbed檢視資料檔案的資料塊block 0及block 1BloC
- 後端返回無限極陣列後, 前端進行無限極渲染 , 菜鳥篇後端陣列前端
- 原始碼|HDFS之DataNode:寫資料塊(1)原始碼
- 分層資料 Hierarchical Data 探索 (2.鄰接表模型) 無限極分類模型
- 分層資料 Hierarchical Data 探索 (3.巢狀集合模型) 無限極分類巢狀模型
- 極光大資料:2019年Q1中國移動網際網路資料大資料
- 選單的無限極分類實現