rowid会不会改变(4) alter table move

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 ----所有的记录都换了块存储,存储在5045050451两快上

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一次看看效果:重新使用了5141851419两块

表已更改。

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那样的rowid3占用2rowid,并且原来851419块上,现在由于空间空闲,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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值