数据块中的极限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:\oracle\oradata\myoracle\t_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的数量,过大或过小都会对系统产生不同程度的影响。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值