ITPub博客

首页 > 数据库 > Oracle > 数据块中的极限1(transaction)

数据块中的极限1(transaction)

原创 Oracle 作者:sunwgneuqsoft 时间:2007-12-01 09:25:03 0 删除 编辑

数据块中的极限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。也就是一个数据表上的initransmaxtrans参数的最大值为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 选项值

从上面的测试结果可以看出,数据表上的initransmaxtrans参数的上限果然是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上的initransmaxtrans设置均为255,此时可以看到数据块中的空闲空间为4059个字节。比事务个数为1的时候少了8067 – 4059 = 4008个字节,事务的个数多了0xa9 – 1 = 168。从以上的结果也可以大概推算出每个事务项在data block中所占的空间大约为24个字节。

另外一个比较有趣的现象是,虽然我们在表mytest_2上建立的事务个数应该为255个,但实际上仅仅存在169个,为什么会存在这么大的差别呢,从下面的例子可以看出一点端倪。

block size对事务个数的影响

上面的例子的结论是,在block size的情况下最大transobject169

下面来验证一下在其他的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的数量为255data block中的最小空闲空间为10187字节,空闲百分比为62.18%

block size = 8k的时候,最大的trans的数量为169data block中的最小空闲空间为4059字节,空闲百分比为49.55%

block size = 4k的时候,最大的trans的数量为83data block中的最小空闲空间为2027字节,空闲百分比为49.49%

block size = 2k的时候,最大的trans的数量为41data block中的最小空闲空间为987字节,空闲百分比为48.19%

由此可见,oracle会在trans所占用的空间上和data block的总空间上有一个很好的平衡,不会发生由于过多的事务导致block中的可用空间过少的情况发生。另一方面可提醒我们,要合理设置表上的trans的数量,过大或过小都会对系统产生不同程度的影响。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/8394333/viewspace-987135/,如需转载,请注明出处,否则将追究法律责任。

上一篇: V$PARAMETER
下一篇: 行链接和行迁移
请登录后发表评论 登录
全部评论
  • 博文量
    56
  • 访问量
    759883