降低HWM,消除行移植和行链接。
我们可以通过user_segments 或 user_extents 的blocks来查看hwm
SQL> select segment_name,blocks
SEGMENT_NAME
---------------- ----------
SMTDZ
在usr_extents中查找
SQL> select segment_name,blocks
SEGMENT_NAME
---------------- ----------
SMTDZ
SMTDZ
SQL> select count(*) from smtdz;
----------
SQL> insert into smtdz select * from smtdz;
已创建1015行。
SQL> commit;
提交完成。
SQL> select count(*) from smtdz;
----------
SQL> select segment_name,blocks
SEGMENT_NAME
---------------- ----------
SMTDZ
SQL> select segment_name,blocks from user_extents where segment_name='SMTDZ';
SEGMENT_NAME
---------------- ----------
SMTDZ
SMTDZ
SMTDZ
可以看到当我们insert into smtdz 一批数据后其blocks增加了,我们再对smtdz进行delete下
SQL> delete from smtdz where rownum<1001;
已删除1000行。
SQL> commit;
提交完成。
SQL> select count(*) from smtdz;
----------
未对表smtdz进行分析analyze前
SQL> select segment_name,blocks
SEGMENT_NAME
---------------- ----------
SMTDZ
对表smtdz进行分析
SQL> exec dbms_stats.gather_table_stats(ownname=>'IC',tabname=>'SMTDZ');
PL/SQL 过程已成功完成。
SQL> select segment_name,blocks
SEGMENT_NAME
---------------- ----------
SMTDZ
可见分析表只是修改了user_tables里的num_rows值,对hwm并没有影响
SQL> alter table smtdz move;
表已更改。
SQL> select segment_name,blocks
SEGMENT_NAME
---------------- ----------
SMTDZ
从这里可以看到表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
-------------
T
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
-------------
T