SQL > ALTER TABLE table_name SHRINK SPACE COMPACT; --只压缩数据不下调HWM SQL > ALTER TABLE table_name SHRINK SPACE; --下调HWM
即该技术可以一次性压缩数据及下调HWM,也可以分两个阶段进行,第一阶段:在业务高峰,只压缩数据不下调HWM,第二阶段:在业务空闲时,下调HWM。
(5.2)MOVE Tablespace
语法为:
SQL > ALTER TABLE table_name MOVE TABLESPACE tablepsace_name;
需要注意:
--MOVE后不跟参数也行,不跟参数还是原来的表空间;
--MOVE后需要重建索引;
--如果以后还要网表里插入数据,没必要MOVE。MOVE释放出来的空间,只能这个表使用,其它的表或者segment无法使用。
(5.3)CTAS技术
即重建表技术。
SQL > CREATE TABLE new_table_name AS SELECT * FROM old_table_name; --将表的数据写入到一张新的表里 SQL > DROP TABLE old_table_name; --删除旧表 SQL > RENAME table new_table_name TO old_table_name --将新表名更改为旧表名
(5.4)EXP/IMP或EXPDP/IMPDP技术
与CTAS技术相当。
(5.5)DEALLOCATE技术
利用DEALLOCATE技术可以回收HWM以上从未使用过的数据块。语法如下
SQL > ALTER TABLE table_name DEALLOCATE UNUSED [KEEP integer]; --回收表段HWM以上的空间 SQL > ALTER INDEX index_name DEALLOCATE UNUSED [KEEP integer]; --回收索引段HWM以上的空间
(六)MOVE与SHRINK的区别
MOVE
SHRINK(仅对ASSM有效)
本质
move实际上是block级别的数据块拷贝,对表进行move后,该表所在blockid会发生改变数据的rowid自然也会发生改变,但是数据在table中的存储顺序并没有发生改变
shrink是对行数据进行移动。对表进行shrink后,部分行数据的rowid发生了变化,而table所位于的block区域的位置却没有发生变化。
重建索引
需要重建
可以通过cascade关键字重建
锁
TM(exclusive)
TM(SX)
空间要求
需要有原表大的空闲空间
不需要额外的空间
效果
压缩后会回收空间
压缩后会回收空间
详细例子见下面测试。
(七)高水位问题测试
(8.1)测试目的:
1.了解Oracle统计信息的概念;
2.测试使用delete与truncate删除数据对HWM的影响[主要目的]
(8.2)主要步骤
(1)创建表test01
create table test01 ( id number, name varchar(15) );
这个时候,去查看表与段的参数
SQL> select 2 dt.table_name, 3 dt.blocks, 4 dt.empty_blocks 5 from 6 dba_tables dt 7 where 8 dt.table_name = 'TEST01'; TABLE_NAME BLOCKS EMPTY_BLOCKS ------------------------------ ---------- ------------ TEST01 0 0 SQL> SQL> select 2 ds.segment_name, 3 ds.segment_type, 4 ds.header_file, 5 ds.header_block, 6 ds.bytes, 7 ds.blocks, 8 ds.extents 9 from 10 dba_segments ds 11 where 12 ds.segment_name = 'TEST01'; SEGMENT_NAME SEGMENT_TYPE HEADER_FILE HEADER_BLOCK BYTES BLOCKS EXTENTS ------------- ------------------ ----------- ------------ ---------- ---------- ---------- SQL> exec dbms_stats.gather_table_stats('LIJIAMAN','TEST01'); PL/SQL procedure successfully completed SQL> SQL> select 2 dt.table_name, 3 dt.blocks, 4 dt.empty_blocks 5 from 6 dba_tables dt 7 where 8 dt.table_name = 'TEST01'; TABLE_NAME BLOCKS EMPTY_BLOCKS ------------------------------ ---------- ------------ TEST01 0 0 SQL> SQL> select 2 ds.segment_name, 3 ds.segment_type, 4 ds.header_file, 5 ds.header_block, 6 ds.bytes, 7 ds.blocks, 8 ds.extents 9 from 10 dba_segments ds 11 where 12 ds.segment_name = 'TEST01'; SEGMENT_NAME SEGMENT_TYPE HEADER_FILE HEADER_BLOCK BYTES BLOCKS EXTENTS ------------- ------------- ----------- ------------ ---------- ---------- ----------