当前位置:操作系统 > Unix/Linux >>

[每日一题] 11gOCP 1z0-052 :2013-09-4 block header grows

[每日一题] 11gOCP 1z0-052 :2013-09-4 block header grows
 
 
正确答案是:AD
 
要理解这道题就要去了解数据块的结构。引用OCPPPT中的一幅图:
 
 
从这幅图中可以看出数据块的数据增长(grow)由上往下增长和由下到往上增长的:
1、             由上往下增长是其实是ITL事务槽的事务增加。
在oracle 10g之后默认初始化在创建表时ITL事务槽是2个。这个事务槽的范围是:1-255.就是说最大可以到255个ITL事务槽,什么时间事务槽才会增长呢,当一个数块中的数据在做并行的DML操作时,会申请好多ITL事务槽,所用的空间应该会有PCTFREE这个参数所预留的这空间中申请。
一个事务槽大概占用24个字节,下面用Dump命令转储出数据块的ITL槽务槽信息:
tl           Xid            Uba          Flag  Lck        Scn/Fsc
0x01  0x0004.00f.00000346 0x00c00793.00bb.22 --U-    1   fsc 0x0000.0015a3eb
0x02  0x0000.000.00000000 0x00000000.0000.00 ----    0   fsc 0x0000.00000000
Itl: ITL事务槽号的流水编号
Xid:transac[X]tionidentified(事务ID),由und的段号+undo的槽号+undo槽号的覆盖次数三部分组成
Uba:undo blockaddress记录了最近一次的该记录的前镜像(修改前的值)
Flag:C是提交,U是快速提交,---是未提交
Lck:锁住了几行数据,对应有几个行锁
Scn/Fsc:Scn=SCN ofcommited TX; Fsc=Free space credit(bytes)
这里fsc 0x0000.0015a3eb是指提交的scn,这个值大于上次清除块时的scn=csc:0x00.15a3ea(此scn是这个块中最小的SCN of commited)
SCN WRAP:如果事务已提交并完成清洗,该字段保存事务提交SCN的SCN WRAP部分,否则该字段保存空闲预支字节数(FSC).比如我删除了一行数据10个字节,在事务提前前,这10个字节就属于fsc(即会写到SCN WRAP),只有事务提交后,才能正式返回到空闲空间。
 
 
2、             由下往上增长的其实是表中的数据做UPDATE.
  数据块中使用了参数PCTFREE,默认10%.留着这个空间做UPDATE,在表中我们用了大量的varchar2字段,假设我们定某个字段为varchar2(100),而我们实际插入这个字段是10个字节,这样把块都给插满了(注意数据插入是从块的底层向上插,插到PCTFREE线以下就不再往下插了),好下次要更新数据,如果把一个10字节的修改成100个字节的,这时增加了90个字节,这个90个字节就会去PCTFREE中找,找到了空间直接就更新了,要是找不到就会发生行迁移了,发生行迁移下次查询时就会有性能问题,找一条记录需要读两个数据块。为了尽量避免行迁移发生就用了PCTFEE参数预留些空间出来给UPDATE用。PCTFREE空间在块的头部。
 
 
建表部分语法的存储参数:
PCTFREE(默认10%) ---在ASSM/MSSM都在用。
PCTUSED(默认40%) ---在ASSM下已被废弃了。
INITRANS 2(默认这个参数不写初化始为2,就是ITL事务槽为2)
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,