转载请注明出处:http://write.blog.csdn.net/postedit/11100311
正确答案是: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),只有事务提交后,才能正式返回到空闲空间。
具体可以参数一下这个贴子:明明白白数据块---深入解析数据块格式:
http://www.itpub.net/forum.php?mod=viewthread&tid=1772905
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)
QQ:252803295
学习交流QQ群:
DSI&Core Search Ⅰ 群:127149411(2000人技术群:未满)
DSI&Core Search Ⅱ 群:177089463(1000人技术群:未满)
DSI&Core Search Ⅲ 群:284596437(500人技术群:未满)
DSI&Core Search Ⅳ 群:192136702(500人技术群:未满)
DSI&Core Search Ⅴ 群:285030382(500人闲聊群:未满)
MAIL:[email protected]
BLOG: http://blog.csdn.net/guoyjoe
WEIBO:http://weibo.com/guoyJoe0218