降低HWM,消除行移植和行链接。
我们可以通过user_segments 或 user_extents 的blocks来查看hwm
SQL> select segment_name,blocks
2 from user_segments
3 where segment_name='SMTDZ';
SEGMENT_NAME BLOCKS
---------------- ----------
SMTDZ 16
在usr_extents中查找
SQL> select segment_name,blocks
2 from user_extents where segment_name='SMTDZ';
SEGMENT_NAME BLOCKS
---------------- ----------
SMTDZ 8
SMTDZ 8
SQL> select count(*) from smtdz;
COUNT(*)
----------
1015
SQL> insert into smtdz select * from smtdz;
已创建1015行。
SQL> commit;
提交完成。
SQL> select count(*) from smtdz;
COUNT(*)
----------
2030
SQL> select segment_name,blocks
2 from user_segmentS
3 where segment_name='SMTDZ';
SEGMENT_NAME BLOCKS
---------------- ----------
SMTDZ 24
SQL> select segment_name,blocks from user_extents where segment_name='SMTDZ';
SEGMENT_NAME BLOCKS
---------------- ----------
SMTDZ 8
SMTDZ 8
SMTDZ 8
可以看到当我们insert into smtdz 一批数据后其blocks增加了,我们再对smtdz进行delete下
SQL> delete from smtdz where rownum<1001;
已删除1000行。
SQL> commit;
提交完成。
SQL> select count(*) from smtdz;
COUNT(*)
----------
1030
未对表smtdz进行分析analyze前
SQL> select segment_name,blocks
2 from user_segments
3 where segment_name='SMTDZ';
SEGMENT_NAME BLOCKS
---------------- ----------
SMTDZ 24
对表smtdz进行分析
SQL> exec dbms_stats.gather_table_stats(ownname=>'IC',tabname=>'SMTDZ');
PL/SQL 过程已成功完成。
SQL> select segment_name,blocks
2 from user_segments
3 where segment_name='SMTDZ';
SEGMENT_NAME BLOCKS
---------------- ----------
SMTDZ 24
可见分析表只是修改了user_tables里的num_rows值,对hwm并没有影响
SQL> alter table smtdz move;
表已更改。
SQL> select segment_name,blocks
2 from user_segments
3 where segment_name='SMTDZ';
SEGMENT_NAME BLOCKS
---------------- ----------
SMTDZ 16
从这里可以看到表smtdz的hwm发生了变化,现在只有16个blocks了
我们可以用下面的办法来最方便的进行重组,消除row migration:
SQL> alter table t add t1 date default sysdate;
Table altered.
SQL> c/t1/t2
1* alter table t add t2 date default sysdate
SQL> /
Table altered.
SQL> c/t2/t3
1* alter table t add t3 date default sysdate
SQL> /
Table altered.
SQL> analyze table t compute statistics;
Table analyzed.
SQL> select table_name,num_rows,CHAIN_CNT from user_tables where table_name='T';
TABLE_NAME NUM_ROWS CHAIN_CNT
------------- --------------- ----------
T 41616 3908
SQL> alter table t move ;
Table altered.
SQL> analyze table t compute statistics;
Table analyzed.
SQL> select table_name,num_rows,CHAIN_CNT from user_tables where table_name='T';
TABLE_NAME NUM_ROWS CHAIN_CNT
------------- ---------------- ------------
T 41616 0
摘自: http://tb.blog.youkuaiyun.com/TrackBack.aspx?PostId=485340
1、把表enable movement
2、alter table move后,需要index rebuild,(目前我的表是非分区,无索引的表,不过这里有一点,也是网上看到,说index rebuild不是根据现有数据,而是根据HWM缩减之前的数据进行rebuild,需要进行drop后重建,这个我还没试验过,不知道是否如此)?
3、这个表涉及到存储过程,存储过程又被job调用,是否需要手动编译一下这些对象呢??
4、把表disable movement;
1. 最好把相关job去掉,去掉之前做好重新执行JOB的脚本,待move后重启执行job;
2. move表你要保证1倍的剩余表空间做这些(假设你在同一表空间做move,另外,如果有物化视图、LOB字段、分区表什么的需要更复杂的处理)
3. 你move表之前,最后统计一下表的数据量,并计算一下表的大小,最好使用SQL自动生成脚本,然后执行相关脚本即可;
4. move表后,相关索引就不能再使用了,需要重建(推荐加上online选项),另外move表的时候,会生成大量的日志,如果有必要,请加上nologging选项;
5.最好把相关存储过程什么的重建一下,move表后做一下统计信息更新,注意move表前的统计信息备份。
2. 不需要DROP, Alter index idx rebuild online;就可以了
建议重新跑一次统计信息
EXEC DBMS_STATS.GATHER_TABLE_STATS('OWNER','TABLE',estimate_percent=>30,CASCADE=> TRUE);
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/241379/viewspace-730646/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/241379/viewspace-730646/