转载-oracle Shrink命令的使用

10g开始,oracle开始提供Shrink的命令,假如我们的表空间中支持自动段空间管理  (ASSM),就可以使用这个特性缩小段,即降低HWM

Shrink的两大功能

1、降低高水位线会使得full  table  scan的效率得以提升

2、回缩数据库空闲的空间

 

segment  shrink分为两个阶段 

 

1、数据重组(compact):通过一系列insertdelete操作,将数据尽量排列在段的前面。在这个过程中需要在表上加RX锁,即只在需要移动的行上加锁。由于涉及到rowid的改变,需要enable  row  movement.同时要disable基于rowidtrigger.这一过程对业务影响比较小。 

 

2HWM调整:第二阶段是调整HWM位置,释放空闲数据块。此过程需要在表上加X锁,会造成表上的所有DML语句阻塞。在业务特别繁忙的系统上可能造成比较大的影响。 

 

shrink  space语句两个阶段都执行。                  

shrink  space  compact只执行第一个阶段。 

 

如果系统业务比较繁忙,可以先执行shrink  space  compact重组数据,然后在业务不忙的时候再执行shrink  space降低HWM释放空闲数据块。 

 

shrink必须开启行迁移功能。 

alter  table  table_name  enable  row  movement  ; 

 

注意:alter  table  XXX  enable  row  movement语句会造成引用表XXX的对象(如存储过程、包、视图等)变为无效。执行完成后,最好执行一下utlrp.sql来编译无效的对象。 

 

语法: 

alter  table  <table_name>  shrink  space  [    |  compact  |  cascade  ]; 

alter  table  <table_name>  shrink  space  compcat;      

 

收缩表,相当于把块中数据打结实了,但会保持  high  water  mark; 

 

alter  table  <tablespace_name>  shrink  space; 

收缩表,降低  high  water  mark; 

 

alter  table  <tablespace_name>  shrink  space  cascade; 

收缩表,降低  high  water  mark,并且相关索引也要收缩一下下。 

 

alter  index  idxname  shrink  space; 

 

回缩索引 

 

1:普通表 

Sql脚本,改脚本会生成相应的语句 

selectalter  table  ‘||table_name||’  enable  row  movement;’||chr(10)||’alter  table  ‘||table_name||’  shrink  space;’||chr(10)from  user_tables; 

 

selectalter  index  ‘||index_name||’  shrink  space;’||chr(10)from  user_indexes; 

 

注:这里可以直接通过oem工具,在段的指导建议案里面得出哪些对象是需要操作的,并且OEM会直接给出SQL.

 

2:分区表的处理 

进行shrink  space  发生ORA-10631错误.shrink  space有一些限制. 

在表上建有函数索引(包括全文索引)会失败。 

 

Sql脚本,改脚本会生成相应的语句 

select  ‘alter  table  ‘||table_name||’  enable  row  movement;’||chr(10)||’alter  table  ‘||table_name||’  shrink  space;’||chr(10)  from  user_tables  where  ; 

 

select  ‘alter  index  ‘||index_name||’  shrink  space;’||chr(10)  from  user_indexes  where  uniqueness=’NONUNIQUE’  ;        www.2cto.com   

 

select  ‘alter  table  ‘||segment_name||’  modify  subpartition  ‘||partition_name||’  shrink  space;’||chr(10)  from  user_segments  where  segment_type=TABLE  SUBPARTITION’  ‘;  

请使用浏览器的分享功能分享到微信等