降低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
如果索引和表放在同一个表空间请大家慎用alter table move,它会让index变为UNUSABLE。
操作过程:
SQL> alter table TEST_COURSE MOVE;
已更改表格.
SQL> set time on;
09:28:48 SQL> alter table TEST_flow_dt move;
已更改表格.
09:30:15 SQL> alter table TEST_transfer move;
已更改表格.
SQL> select index_name,index_type,tablespace_name,table_type,status from user_indexes where table_name IN ('TEST_FLOW_DT','TEST_COURSE','TEST_TRANSFER');
INDEX_NAME INDEX_TYPE TABLESPACE_NAME TABLE_TYPE STATUS
------------------------------ --------------------------- ------------------------------ ----------- --------
INX_TEST_COURSE_02 NORMAL TEST TABLE UNUSABLE
INX_TEST_COURSE_01 NORMAL TEST TABLE UNUSABLE
PK_TEST_COURSE NORMAL TEST TABLE UNUSABLE
INX_TEST_COURSE_03 NORMAL TEST TABLE UNUSABLE
INX_TEST_FLOW_DT_04 NORMAL TEST TABLE UNUSABLE
INX_TEST_FLOW_DT_01 NORMAL TEST TABLE UNUSABLE
INX_TEST_FLOW_DT_07 FUNCTION-BASED NORMAL TEST TABLE UNUSABLE
INX_TEST_FLOW_DT_06 FUNCTION-BASED NORMAL TEST TABLE UNUSABLE
INX_TEST_FLOW_DT_05 NORMAL TEST TABLE UNUSABLE
IND_TEST_FLOW_DT_03 NORMAL TEST TABLE UNUSABLE
IND_TEST_FLOW_DT_02 NORMAL TEST TABLE UNUSABLE
PK_TEST_FLOW_DT NORMAL TEST TABLE UNUSABLE
IND_TRAN_ORG NORMAL TEST TABLE UNUSABLE
IND_TEST_TRANSFER02 NORMAL TEST TABLE UNUSABLE
PK_TEST_TRANSFE NORMAL TEST TABLE UNUSABLE
INX_TEST_TRANSFER_01 NORMAL TEST TABLE UNUSABLE
出现这种情况必须重建索引
alter index INX_TEST_COURSE_02 rebuild;
alter index INX_TEST_COURSE_01 rebuild;
alter index PK_TEST_COURSE rebuild;
alter index INX_TEST_COURSE_03 rebuild;
alter index INX_TEST_FLOW_DT_04 rebuild;
alter index INX_TEST_FLOW_DT_01 rebuild;
alter index INX_TEST_FLOW_DT_07 rebuild;
alter index INX_TEST_FLOW_DT_06 rebuild;
alter index INX_TEST_FLOW_DT_05 rebuild;
alter index IND_TEST_FLOW_DT_03 rebuild;
alter index IND_TEST_FLOW_DT_02 rebuild;
alter index PK_TEST_FLOW_DT rebuild;
alter index IND_TRAN_ORG rebuild;
alter index IND_TEST_TRANSFER02 rebuild;
alter index PK_TEST_TRANSFE rebuild;
alter index INX_TEST_TRANSFER_01 rebuild;
本篇文章来源于 Linux公社网站(www.linuxidc.com) 原文链接:http://www.linuxidc.com/Linux/2013-02/78961.htm