首先:这是10G中用来在线回收高水位线的一个命令,9i中无此命令,9i中最好用move。
其次:使用这个命令要enable 表上的row movement,也就是行的rowid会改变,依赖rowid的一些应用可能受影响。使用此语句前要disable rowid相关的trigger
第三,这个语句只用在ASSM表空间下,可以适用于表,索引组织表,溢出段,索引,分区,子分区,lob段,物化视图,物化视图日志。
使用例子:
baal@baal> insert into t select * from dba_objects;
已创建50319行。
已用时间: 00: 00: 01.21
baal@baal> commit;
提交完成。
baal@baal> insert into t select * from t;
已创建50319行。
已用时间: 00: 00: 00.14
baal@baal> /
已创建100638行。
已用时间: 00: 00: 00.50
baal@baal> commit;
提交完成。
baal@baal> analyze table t compute statistics;
表已分析。
已用时间: 00: 00: 08.89
baal@baal> select num_rows,blocks,empty_blocks from user_tables where table_name=’T';
NUM_ROWS BLOCKS EMPTY_BLOCKS
———- ———- ————
201276 2764 52
已用时间: 00: 00: 00.01
baal@baal> delete from t where rownum<150000;
已删除149999行。
已用时间: 00: 00: 09.25
baal@baal> commit;
提交完成。
已用时间: 00: 00: 00.01
baal@baal> analyze table t compute statistics;
表已分析。
已用时间: 00: 00: 01.89
baal@baal> select num_rows,blocks,empty_blocks from user_tables where table_name=’T';
NUM_ROWS BLOCKS EMPTY_BLOCKS
———- ———- ————
51277 2764 52
baal@baal> SELECT COUNT (DISTINCT DBMS_ROWID.ROWID_BLOCK_NUMBER(rowid)||DBMS_ROWID.ROWID_RELATIVE_FNO(rowid)) “Used” FROM T;
Used
———-
703
此时实际的数据只使用了703个块,2764-703=2061,便是高水位线下空闲的块。
baal@baal> alter table t deallocate unused;
表已更改。
baal@baal> analyze table t compute statistics;
表已分析。
baal@baal> SELECT COUNT (DISTINCT DBMS_ROWID.ROWID_BLOCK_NUMBER(rowid)||DBMS_ROWID.ROWID_RELATIVE_FNO(rowid)) “Used” FROM T;
Used
———-
703
已用时间: 00: 00: 01.48
baal@baal> select num_rows,blocks,empty_blocks from user_tables where table_name=’T';
NUM_ROWS BLOCKS EMPTY_BLOCKS
———- ———- ————
51277 2764 52
使用alter table t deallocate unused命令对高水位线的回收没有作用。
baal@baal> alter table t shrink space;
alter table t shrink space
*
第 1 行出现错误:
ORA-10636: ROW MOVEMENT is not enabled
baal@baal> alter table t enable row movement;
表已更改。
已用时间: 00: 00: 00.18
baal@baal> alter table t shrink space compact;
表已更改。
baal@baal> select num_rows,blocks,empty_blocks from user_tables where table_name=’T';
NUM_ROWS BLOCKS EMPTY_BLOCKS
———- ———- ————
51277 2764 52
已用时间: 00: 00: 00.04
baal@baal> SELECT COUNT (DISTINCT DBMS_ROWID.ROWID_BLOCK_NUMBER(rowid)||DBMS_ROWID.ROWID_RELATIVE_FNO(rowid)) “Used” FROM T;
Used
———-
703
使用alter table t shrink space compact命令并不会回收高水位线只是移动行。是shrink的第一步
baal@baal> alter table t shrink space;
表已更改。
baal@baal> analyze table t compute statistics;
表已分析。
baal@baal> select num_rows,blocks,empty_blocks from user_tables where table_name=’T';
NUM_ROWS BLOCKS EMPTY_BLOCKS
———- ———- ————
51277 703 25
已用时间: 00: 00: 00.00
baal@baal> SELECT COUNT (DISTINCT DBMS_ROWID.ROWID_BLOCK_NUMBER(rowid)||DBMS_ROWID.ROWID_RELATIVE_FNO(rowid)) “Used” FROM T;
Used
———-
703
完成之后发现高水位线已经下降。
此时可以取消掉对象上的row movement。
baal@baal> alter table t disable row movement;
表已更改。
联系客服