alter table move也会改变某行的rowid
1 alter table move会利用删除空闲的空间
SQL> truncate table t;
表已截掉。
SQL> insert into t select rownum,lpad('a',1000) from dba_objects where rownum<11;
已创建10行。
SQL> commit;
提交完成。
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 3
SQL> select rowid,x from t;
ROWID X
------------------ ----------
AAAHruAABAAAMjaAAA 1
AAAHruAABAAAMjaAAB 2
AAAHruAABAAAMjaAAC 3
AAAHruAABAAAMjaAAD 4
AAAHruAABAAAMjaAAE 5
AAAHruAABAAAMjaAAF 6
AAAHruAABAAAMjaAAG 7
AAAHruAABAAAMjbAAA 8
AAAHruAABAAAMjbAAB 9
AAAHruAABAAAMjbAAC 10
SQL> alter table t move;
表已更改。
SQL> select rowid,x from t;
ROWID X
------------------ ----------
AAAHrvAABAAAMUSAAA 2 ----所有的记录都换了块存储,存储在50450和50451两快上
AAAHrvAABAAAMUSAAB 3
AAAHrvAABAAAMUSAAC 4
AAAHrvAABAAAMUSAAD 5
AAAHrvAABAAAMUSAAE 6
AAAHrvAABAAAMUSAAF 7
AAAHrvAABAAAMUSAAG 8
AAAHrvAABAAAMUTAAA 9
AAAHrvAABAAAMUTAAB 10
已选择9行。
SQL> @table_blocks
输入 table 的值: t
原值 4: from &table) group by f,b
新值 4: from t) group by f,b
F B COUNT(*)
---------- ---------- ----------
1 50450 7
1 50451 2
SQL> alter table t move; ---再move一次看看效果:重新使用了51418和51419两块
表已更改。
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 2
SQL> select rowid,x from t;
ROWID X
------------------ ----------
AAAHrwAABAAAMjaAAA 2 ----现在2这行的rowid是原来1那样的rowid,3占用2的rowid,并且原来8在51419块上,现在由于空间空闲,8现在在51418块上
AAAHrwAABAAAMjaAAB 3
AAAHrwAABAAAMjaAAC 4
AAAHrwAABAAAMjaAAD 5
AAAHrwAABAAAMjaAAE 6
AAAHrwAABAAAMjaAAF 7
AAAHrwAABAAAMjaAAG 8
AAAHrwAABAAAMjbAAA 9
AAAHrwAABAAAMjbAAB 10
已选择9行。
2 alter table move 被迁移的行会迁回来
SQL> update t set y=lpad('a',1999) where x=2;
已更新 1 行。
SQL> update t set y=lpad('a',1999) where x=3;
已更新 1 行。
SQL> commit;
提交完成。
dump datafile 发生了行迁移
tab 0, row 0, @0x1f7f
tl: 9 fb: --H----- lb: 0x0 cc: 0
nrid: 0x0040c8dc.0
SQL> delete from t where x in(3,4,5);
已删除3行。
SQL> commit;
提交完成。
dump datafile 依然是行迁移状态
SQL> alter table t move;
表已更改。
SQL> @table_blocks
输入 table 的值: t
原值 4: from &table) group by f,b
新值 4: from t) group by f,b
F B COUNT(*)
---------- ---------- ----------
1 50450 6 ----已经move到其他块上,并且一块已经能容纳所有的记录
3 可以alter table move tablespace
这个显然可以改变所有行的rowid
SQL> truncate table t;
表已截掉。
SQL> insert into t select rownum,lpad('a',1000) from dba_objects where rownum<11
;
已创建10行。
SQL> commit;
提交完成。
SQL> select rowid,x from t;
ROWID X
------------------ ----------
AAAHryAABAAAMUSAAA 1
AAAHryAABAAAMUSAAB 2
AAAHryAABAAAMUSAAC 3
AAAHryAABAAAMUSAAD 4
AAAHryAABAAAMUSAAE 5
AAAHryAABAAAMUSAAF 6
AAAHryAABAAAMUSAAG 7
AAAHryAABAAAMUTAAA 8
AAAHryAABAAAMUTAAB 9
AAAHryAABAAAMUTAAC 10
已选择10行。
SQL> alter table t move tablespace test;
表已更改。
SQL> select rowid,x from t;
ROWID X
------------------ ----------
AAAHrzAAMAAAAAMAAA 1
AAAHrzAAMAAAAAMAAB 2
AAAHrzAAMAAAAAMAAC 3
AAAHrzAAMAAAAAMAAD 4
AAAHrzAAMAAAAAMAAE 5
AAAHrzAAMAAAAAMAAF 6
AAAHrzAAMAAAAAMAAG 7
AAAHrzAAMAAAAANAAA 8
AAAHrzAAMAAAAANAAB 9
AAAHrzAAMAAAAANAAC 10
已选择10行。
4 alter table move可以使索引失效
SQL> create index tindex1 on t(x);
索引已创建。
SQL> select count(*) from t;
COUNT(*)
----------
0
SQL> alter table t move tablespace test2;
表已更改。
SQL> select index_name,status from dba_indexes where index_name='TINDEX1';
INDEX_NAME STATUS
------------------------------ --------
TINDEX1 VALID ----因为t表里没有记录所以alter table move tablespace并没有使索引失效
SQL> insert into t select rownum,'tttt' from dba_objects where rownum<11;
已创建10行。
SQL> commit;
提交完成。
SQL> alter table t move tablespace test2;
表已更改。
SQL> select index_name,status from dba_indexes where index_name='TINDEX1';
INDEX_NAME STATUS
------------------------------ --------
TINDEX1 UNUSABLE---索引失效
SQL> alter index tindex1 rebuild;
索引已更改。
SQL> select index_name,status from dba_indexes where index_name='TINDEX1';
INDEX_NAME STATUS
------------------------------ --------
TINDEX1 VALID ---rebuild索引后,索引正常
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/22111412/viewspace-613677/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/22111412/viewspace-613677/