高水位线的压缩
Oracle 10g
开始采用了
shrink
技术
Shrink
是通过事务的方式将数据行从一个数据块转移到另一个数据块。收缩过程中,表仍然可以进行
DML
操作
当然,事务要能够进行
DML
操作,还是需要等待收缩引起的事务锁释放。
收缩虽然是事务,但是数据并没有发生变化,因此不会引起触发器的触发。
使用
shrink
的前提条件
1
、表所在的表空间必须使用
ASSM
(自动段空间管理)
2
、在收缩表上必须启用
row movement
选项
建立一张表
SQL> create table test_shrik (id number ) tablespace users;
Table created.
查看各个表空间管理信息
SQL> select tablespace_name,t.segment_space_management
2 from dba_tablespaces t
3 where tablespace_name in ('SYSTEM','USERS');
TABLESPACE_NAME SEGMEN
------------------------------ ------
SYSTEM MANUAL
USERS AUTO
插入数据
SQL> insert into test_shrik
2 select rownum from dual connect by level <=200000;
200000 rows created.
SQL> commit ;
Commit complete.
查看统计信息
SQL> select t.table_name,BLOCKS,EMPTY_BLOCKS,NUM_ROWS
2 from user_tables t
3 where table_name = upper('test_shrik');
TABLE_NAME BLOCKS EMPTY_BLOCKS NUM_ROWS
------------------------------ ---------- ------------ ----------
TEST_SHRIK
收集统计信息
SQL> exec dbms_stats.gather_table_stats('sys','test_shrik');
PL/SQL procedure successfully completed.
SQL> select t.table_name,BLOCKS,EMPTY_BLOCKS,NUM_ROWS
2 from user_tables t
3 where table_name = upper('test_shrik');
TABLE_NAME BLOCKS EMPTY_BLOCKS NUM_ROWS
<