数据块中的极限1(transaction)
来源:互联网 发布:java面试宝典 pdf 编辑:程序博客网 时间:2024/06/02 00:44
一前言
在oracle中关于表的许多属性值都是有限制的,而这些限制很多都是由于data block中的相应属性的表达方式造成的。下面我们研究一下表上的transaction的限制。
三transaction的空间占用
Dump结果中的avsp字段的值为data block中的可用空间数量,单位为字节。可以看到当表上事务为1的时候,可以空间为8067字节
例三
表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的时候,最大的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的数量,过大或过小都会对系统产生不同程度的影响。
在oracle中关于表的许多属性值都是有限制的,而这些限制很多都是由于data block中的相应属性的表达方式造成的。下面我们研究一下表上的transaction的限制。
SQL> create table mytest 2 (id varchar2(3)) 3 initrans 1 4 maxtrans 255;Table createdSQL> insert into mytest values ('a');1 row insertedSQL> commit;Commit completeSQL> set serveroutput onSQL> exec show_space('MYTEST');Free Blocks.............................1Total Blocks............................8Total Bytes.............................65536Unused Blocks...........................6Unused Bytes............................49152Last Used Ext FileId....................11Last Used Ext BlockId...................41Last Used Block.........................2PL/SQL procedure successfully completedSQL> 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.125Start dump data blocks tsn: 12 file#: 11 minblk 42 maxblk 42buffer tsn: 12 rdba: 0x02c0002a (11/42)scn: 0x0000.0f331f36 seq: 0x01 flg: 0x02 tail: 0x1f360601frmt: 0x02 chkval: 0x0000 type: 0x06=trans dataBlock 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/Fsc0x01 0x0002.00f.00004407 0x00801136.02a3.1b --U- 1 fsc 0x0000.0f331f360x02 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000 data_block_dump,data header at 0x4f6305c===============tsiz: 0x1fa0hsiz: 0x14pbl: 0x04f6305cbdba: 0x02c0002a 76543210flag=--------ntab=1nrow=1frre=-1fsbo=0x14fseo=0x1f9bavsp=0x1f83tosp=0x1f830xe:pti[0]nrow=1offs=00x12:pri[0]offs=0x1f9bblock_row_dump:tab 0, row 0, @0x1f9btl: 5 fb: --H-FL-- lb: 0x1 cc: 1col 0: [ 1] 61end_of_block_dumpEnd 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 256ORA-02207: 无效的 INITRANS 选项值SQL> create table mytest_1(id varchar2(10))initrans 1 maxtrans 256ORA-02209: 无效的 MAXTRANS 选项值从上面的测试结果可以看出,数据表上的initrans和maxtrans参数的上限果然是255。
三transaction的空间占用
Itl Xid Uba Flag Lck Scn/Fsc0x01 0x0002.00f.00004407 0x00801136.02a3.1b --U- 1 fsc 0x0000.0f331f360x02 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000为事物列表在数据块中的存储结果,可以看到他会占用一定的空间,那么可以推断到transaction的个数越多,那么他在data block中占用的空间就会越多,data block用来存储表中记录的空间也会相应的减少。
例二
SQL> show parameter block_sizeNAME TYPE VALUE------------------------------------ ---------------------- -----------------------------------------------db_block_size integer 8192QL> create table mytest_1 2 (id varchar2(10)) 3 initrans 1 4 maxtrans 1;Table createdSQL> insert into mytest_1 values ('b');1 row insertedSQL> commit;Commit completeSQL> set serveroutput on SQL> exec show_space('MYTEST_1');Free Blocks.............................1Total Blocks............................8Total Bytes.............................65536Unused Blocks...........................6Unused Bytes............................49152Last Used Ext FileId....................11Last Used Ext BlockId...................49Last Used Block.........................2PL/SQL procedure successfully completedSQL> alter system dump datafile 11 block 50;System altered
*** 2006-06-16 22:25:03.750Start dump data blocks tsn: 12 file#: 11 minblk 50 maxblk 50buffer tsn: 12 rdba: 0x02c00032 (11/50)scn: 0x0000.0f332d2d seq: 0x01 flg: 0x02 tail: 0x2d2d0601frmt: 0x02 chkval: 0x0000 type: 0x06=trans dataBlock 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/Fsc0x01 0x0010.029.00000005 0x008000e4.0001.49 --U- 1 fsc 0x0000.0f332d2d0x02 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000 data_block_dump,data header at 0x4cf305c===============tsiz: 0x1fa0hsiz: 0x14pbl: 0x04cf305cbdba: 0x02c00032 76543210flag=--------ntab=1nrow=1frre=-1fsbo=0x14fseo=0x1f9bavsp=0x1f83tosp=0x1f830xe:pti[0]nrow=1offs=00x12:pri[0]offs=0x1f9bblock_row_dump:tab 0, row 0, @0x1f9btl: 5 fb: --H-FL-- lb: 0x1 cc: 1col 0: [ 1] 62end_of_block_dumpEnd 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 createdSQL> insert into mytest_2 values ('b');1 row insertedSQL> commit;Commit completeSQL> exec show_space('MYTEST_2');Free Blocks.............................1Total Blocks............................8Total Bytes.............................65536Unused Blocks...........................6Unused Bytes............................49152Last Used Ext FileId....................11Last Used Ext BlockId...................57Last Used Block.........................2PL/SQL procedure successfully completedSQL> alter system dump datafile 11 block 58;System altered
*** 2006-06-16 22:30:18.140Start dump data blocks tsn: 12 file#: 11 minblk 58 maxblk 58buffer tsn: 12 rdba: 0x02c0003a (11/58)scn: 0x0000.0f333100 seq: 0x01 flg: 0x02 tail: 0x31000601frmt: 0x02 chkval: 0x0000 type: 0x06=trans dataBlock 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/Fsc0x01 0x0006.00f.00004408 0x0080085b.0299.45 --U- 1 fsc 0x0000.0f3331000x02 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.000000000x03 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000。。。。。。。。。。。。。。。。。。0x58 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.000000000xa7 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.000000000xa8 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.000000000xa9 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000 data_block_dump,data header at 0x4cf4004===============tsiz: 0xff8hsiz: 0x14pbl: 0x04cf4004bdba: 0x02c0003a 76543210flag=--------ntab=1nrow=1frre=-1fsbo=0x14fseo=0xff3avsp=0xfdbtosp=0xfdb0xe:pti[0]nrow=1offs=00x12:pri[0]offs=0xff3block_row_dump:tab 0, row 0, @0xff3tl: 5 fb: --H-FL-- lb: 0x1 cc: 1col 0: [ 1] 62end_of_block_dumpEnd 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的数量,过大或过小都会对系统产生不同程度的影响。
0 0
- 数据块中的极限1(transaction)
- 挑战极限—极限编程中的“极限”
- scn(数据块中的scn)
- Mongodb一些极限数据
- 关于极限小数据!!!
- 详解oracle数据块中的空闲空间
- 内存块中的数据转存入位图
- oracle数据块中的scn何时变化
- Hadoop中的数据块为何如此大
- 2.2.1 数据块结构
- SQL中的ROLLBACK TRANSACTION
- redis中的transaction
- Hibernate 中的 Transaction(事务)
- Transaction中的SQL死锁
- Hibernate中的事物Transaction
- 数据块
- 数据块
- 极限编程中的测试(自产)
- linux下给目录下所有子目录和文件赋权
- 38句格言
- 天五戊土生地四庚金
- Dalvik VM介绍
- 2014年大数据发展趋势预测及其解读
- 数据块中的极限1(transaction)
- android 后台长时间执行周期性定时任务 解决方案收集
- 安卓StateMachine运行过程理解(翻译)
- 汇编语言笔记1 基础数据,定义,语令
- wince event用法实例
- mina粘包、多包和少包的解决方法
- 关于struts2 返回的结果是一个 简单的字符串的解决
- 几道数字算法问题1
- Ubuntu下忘记MySQL root密码解决方法