oracle收缩表空间

1.非自动管理(非ASSM)

--通过rowid提取数据块编号
select count(distinct dbms_rowid.rowid_block_number(rowid)) used_blocks from TEST_HM;
--通过rowid提取相关文件编号
 SELECT COUNT (DISTINCT DBMS_ROWID.ROWID_RELATIVE_FNO(rowid)) "Used"  FROM TEST_HM;

--缩小前10M,1280 blocks;缩小后0.8M,104 blocks;
SELECT segment_name, segment_type, blocks,BYTES/1024/1024 mb 
FROM dba_segments
WHERE  segment_name like 'TEST_HM' 

--缩小前1243,36,6862;缩小后103,0,6931
ANALYZE TABLE TEST_HM  ESTIMATE   STATISTICS;
SELECT blocks, empty_blocks, num_rows
FROM user_tables
WHERE table_name = 'TEST_HM';

--命令

alter table TEST_HM move;

2.10g版本以后,shrink space 仅对ASSM自动管理表空间有效

SELECT TABLESPACE_NAME, SEGMENT_SPACE_MANAGEMENT FROM DBA_TABLESPACES WHERE TABLESPACE_NAME= 'TABLESPACE_NAME'

------------------------------------------------------------------------ 
xxxxxxx        MANUAL

--命令

此过程需要在表上加X锁,会造成表上的所有DML语句阻塞。在业务特别繁忙的系统上可能造成比较大的影响。
注意:shrink space语句两个阶段都执行。
shrink space compact只执行第一个阶段。
如果系统业务比较繁忙,
可以先执行shrink space compact重组数据,然后在业务不忙的时候再执行shrink space降低HWM释放空闲数据块 

  alter table TABLE_NAME shrink space compact;  只整理碎片 不回收空间,  
  alter table TABLE_NAME shrink space;                 整理碎片并回收空间。

  alter table TABLE_NAME shrink space cascade;    整理碎片回收空间 并连同表的级联对象一起整理(比如索引)
  --分区表
  alter table ticket modify  PARTITION P28071 shrink space cascade

alter table TEST_HM enable row movement;

alter table test_hm shrink space compact cascade;

alter table TEST_HM disable row movement;

注意:

1.再用alter table table_name move时,表相关的索引会失效,所以之后还要执行 alter index index_name rebuild online; 最后重新编译数据库所有失效的对象

2. 在用alter table table_name shrink space cascade时,他相当于alter table table_name move和alter index index_name rebuild online. 所以只要编译数据库失效的对象就可以
3.shrink space收缩到数据存储的最小值,alter table move(不带参数)收缩到initial指定值,也可以用alter table test5 move storage(initial 500k)指定收缩的大小,这样可以达到shrink space效果

经过以上测试,得出的两个结论,到底用哪一个命令来整理碎片,消除行迁移呢?这就要根据实际业务需要,如果你只是收缩空间,数据增长很慢,那用shrink可以但是如果数据增长很快的话,用move就比较合适,避免再重新分配空间啊

猜你喜欢

转载自blog.csdn.net/xianjuke008/article/details/86524946