SQL> drop table t;
表已丢弃。
SQL> create table t (x int,y varchar2(2000));
表已创建。
SQL> insert into t select rownum,lpad('a',1000)
2 from dba_objects where rownum<9;
已创建8行。
SQL> commit;
提交完成。
从字段所占长度分析,每块估计能容纳t表的7条记录左右
SQL> @table_blocks
输入 table 的值: t
原值 4: from &table) group by f,b
新值 4: from t) group by f,b
F B COUNT(*)
---------- ---------- ----------
1 51418 7
1 51419 1
发现块51418已经满了
记录下此时的rowid
SQL> select rowid,x from t;
ROWID X
------------------ ----------
AAAHrlAABAAAMjaAAA 1
AAAHrlAABAAAMjaAAB 2
AAAHrlAABAAAMjaAAC 3
AAAHrlAABAAAMjaAAD 4
AAAHrlAABAAAMjaAAE 5
AAAHrlAABAAAMjaAAF 6
AAAHrlAABAAAMjaAAG 7
AAAHrlAABAAAMjbAAA 8
已选择8行。
SQL> update t set y=lpad('a',1999) where x=1;
已更新 1 行。
SQL> commit;
提交完成。
将x=1的行增大占用空间
dump 51418块,发现row 0上的数据还在,估计可能是使用了pctfree的容量
考虑将x=2的行增大占用空间
SQL> update t set y=lpad('a',1999) where x=2;
已更新 1 行。
SQL> commit;
提交完成。
dump 51418块,row 1上没有数据了,取而代之的是个指针,指向容纳数据的新块
tab 0, row 1, @0x1baf
tl: 9 fb: --H----- lb: 0x1 cc: 0
nrid: 0x0040c8db.1
迁移到了 block 编号为 0x0040c8db的块中的 row 1上
1 select dbms_utility.DATA_BLOCK_ADDRESS_FILE(to_number('40c8db','xxxxxxxxxx')) file#
2 ,dbms_utility.DATA_BLOCK_ADDRESS_BLOCK(to_number('40c8db', 'xxxxxxxxxx')) block#
3 from dual
SQL> /
FILE# BLOCK#
---------- ----------
1 51419
果然是迁移到了51419块上
此时我们再看看x=2的rowid
ROWID X
------------------ ----------
AAAHrlAABAAAMjaAAA 1
AAAHrlAABAAAMjaAAC 3
AAAHrlAABAAAMjaAAD 4
AAAHrlAABAAAMjaAAE 5
AAAHrlAABAAAMjaAAF 6
AAAHrlAABAAAMjaAAG 7
AAAHrlAABAAAMjbAAA 8
AAAHrlAABAAAMjaAAB 2
当行迁移时,虽然数据的物理位置发生了变化,但rowid不会变
但在一些特殊的操作时,数据的rowid是可能变化的
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/22111412/viewspace-613500/ ,如需转载,请注明出处,否则将追究法律责任。