回缩表高水位的意义:
所有的 Oracle 段都有一个在段内容纳数据的上线,即高水位线(high water mark)。HWM 是一个标记,很像水库的丽水最高水位,即使表内数据全部删除,HWM 也还是为原值。也就是说,这条高水位线在日常的增删操作中只会上涨,不会下跌。
回缩表高水位方法:
1.SHRINK 方法
该方式可在线执行,原理参见《Oracle-11g 中 SHRINK 详解》,步骤如下。
(1).检查对象所在表空间是否为 ASSM 模式
SQL> SELECT tablespace_name, segment_space_management
FROM dba_tablespaces;
(2).启用表的行移动功能
SQL> ALTER TABLE table_name ENABLE ROW MOVEMENT;
其中,table_name 代表回缩表名。
(3).压缩并反碎片化表
SQL> ALTER TABLE table_name SHRINK SPACE COMPACT;
其中,table_name 代表回缩表名。注意:使用 COMPACT 子句,可以在对系统影响较小的情况下,先进行数据移动压缩。
(4).待业务非高峰期,回缩表高水位
SQL> ALTER TABLE table_name SHRINK SPACE;
其中,table_name 代表回缩表名。
(5).禁用表的行移动功能(可选)
SQL> ALTER TABLE table_name DISABLE ROW MOVEMENT;
其中,table_name 代表回缩表名。
(6).更新表统计信息
2.MOVE 方法
MOVE 的方法不可在线执行。
(1).移动表
SQL> ALTER TABLE table_name MOVE;
注意:MOVE 后不带表空间,将在原表空间移动表。
(2).查询失效索引
SQL> SELECT index_name,table_name,tablespace_name,status
FROM dba_indexes
WHERE owner='&table_owner'
AND table_name='&table_name'
AND status<>'VALID';
其中,table_owner 代表表所属用户,table_name 代表回缩表名。
(3).重建索引
SQL> ALTER INDEX index_name REBUILD;
其中,index_name 为索引名称。
(4).验证重建情况
SQL> SELECT index_name,table_name,tablespace_name,status
FROM dba_indexes
WHERE owner='&table_owner'
AND table_name='&table_name'
AND status<>'VALID';
(5).更新表统计信息
其中,table_owner 代表表所属用户,table_name 代表回缩表名。
3.TRUNCATE 方法
TRUNCATE 方法不可在线执行,且不适合大数据量的执行(数据会插)。
(1).创建保存数据的临时表
SQL> CREATE TABLE table_temp_name AS SELECT * FROM table_name;
其中,table_temp_name 代表临时表名,table_name 代表回缩表名。
(2).截断表
SQL> TRUNCATE TABLE table_name;
其中,table_name 代表回缩表名。
(3).会插数据
SQL> INSERT INTO table_name SELECT * FROM table_temp_name;
其中,table_temp_name 代表临时表名,table_name 代表回缩表名。
(4).更新表统计信息