ITPub博客

首页 > Linux操作系统 > Linux操作系统 > [转载]alter table move的用途

[转载]alter table move的用途

原创 Linux操作系统 作者:47328983 时间:2012-05-23 08:48:16 0 删除 编辑

降低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.csdn.net/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/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-03-07

  • 博文量
    111
  • 访问量
    332238