|
最初由 l2g32003 发布
[B]我没说 rowid在 row 中啊 我是说11字节并不是因为你想的那种情况而定义的长度
oracle定义row的长度最小为11字节是为行迁移而考虑的
来个例子
create table t (v varchar2(2000)) pctfree 0;
现在我不断的向table中 insert into t values('a');
假如block中如果不为一行分配11字节的最小的空间也就是整个block中全部被数据填满了
好 我现在又执行一句 update t set v='aaa.......aaa' where rownum=1 --2000个a
这行肯定发生行迁移了 行迁移的时候row的情况就是我说的那种11字节
这时行迁移的row比以前的row要多用4个字节 而block中如果填满了数据就没办法分配这4个字节
oracle肯定不能这样嘛 所以oracle定义的最小行的11个字节是为行迁移的情况考虑的
这11个字节也就是这样组成的 [/B]
嗯,以你的这个思路,我觉得很有道理,只是不太赞同rowid的说法:
这是发生row migration的一段dump:
tab 0, row 8, @0x7f0
tl: 9 fb: --H----- lb: 0x1 cc: 0
nrid: 0x00c007a4.0
------------ nrid表示 row 迁移到了 block编号为 0x00c007a4 的块中的 row 0 (本块为 0x00c007a3)
tl: total length=9, 再加上2bytes的row dictionary entry 为11;
9减掉3 bytes的row header,为6bytes, 应该是存放nrid的。
|
|