
Oracle 中 shrink space 命令
首先 oracle shrink 是 10g 之后才引出的,有 shrink table 和 shrink space 两种,这里介绍 shrink space
压缩分两个阶段:
1、数据重组:这个过程是通过一系列的 insert delete 操作,将数据尽量排在列的前面进行重新组合。
2、HWM 调整:这个过程是对 HWM 的调整,释放空闲数据库。
PS:shrink 之间必须开启行移动功能
alter table table_name enable row movement;
基本语法:
alter table <table_name> shrink space [ <null> | cascade | compact ];
--alter table <table_name> shrink space compact;
只收缩表,这个实际上是只执行了第一个阶段,HWM 保持不变。
--alter table <table_name> shrink space cascade;
收缩表并且相关索引也会被收缩,HWM 会降低
--alter table <table_name> shrink space;
收缩表,降低 HWM(High Water Mark)
限制条件:
1、不能对 cluster、clustered table 或者任何有 LONG 列的对象使用这个语句
2、压缩段不支持有函数索引、位图链接索引的表
3、这语句不能压缩二级索引表的映射表,即使设置了 CASCADE
4、不能对压缩表使用该语句
5、不能压缩 on commit 类型的物化视图的主表,rowid 物化视图必须在压缩操作之后重建
详解:
oracle10g 开始提供 shrink 的命令,要求表空间是自动段空间管理(ASSM),降低 HWM。
segment shrink 分为两个阶段:
1、数据重组(compact):通过一系列 insert、delete 操作,将数据尽量排在段的前面,这个过程中需要在表上加 RX 锁,及只需要
移动的行上加锁。由于涉及到 rowid 的改变,需要 enable row movement。同时要 distable 基于 rowid 的 triggers,这个过程对
业务影响比较小(--由于采用 compact,只有涉及移动的行才加锁,所以不会锁定整个表,其他的 DML 操作有部分可以进行,进而减
小系统高峰期的性能开销)
2、HWM 调整:第二阶段是调整 HWM 位置,释放空闲数据块,此过程需要在表上加 X 锁(独享锁,因此这个表都被锁定,如果系统
处在高峰期的时候,其他在此表的 DML 被挂起,会产生严重阻塞),会造成表上所有 DML 语句阻塞,系统忙时影响较大,
锁的内容参考:http://docs.oracle.com/cd/B19306_01/server.102/b14220/consist.htm
评论