-- 准备环境
create table t1(id int,name varchar2(10));
begin
for i in 1001..100000 loop
insert into t1 values(i,'china'||to_char(i));
end loop;
commit;
end;
-- 查看
select segment_name,segment_type,bytes,blocks from user_segments;
select * from user_extents;
-- 删除记录,收缩表
delete from t1;
commit;
alter table t1 enable row movement; -- rowid将在收缩后改变
alter table t1 shrink space cascade compact;
alter table t1 shrink space compact;
alter table t1 shrink space cascade; -- X
alter table t1 shrink space; -- X
-- 再次查看
select segment_name,segment_type,bytes,blocks from user_segments;
select * from user_extents;
--说明:
/*
alter table/index/materialized view object_name shrink space [cascade] [compact];
cascade:是指压缩所有依赖的对象,比如压缩表语句加上cascade,表上所有的索引都会被压缩
compact:把压缩过程分为两个阶段:第一个阶段的语句带compact,压缩段空间,在这个过程中需要在表上加RX锁,即只在需要移动的行上加锁。
由于涉及到rowid的改变,需要enable row movement.同时要disable基于rowid的trigger.这一过程对业务影响比较小。
第二个阶段语句不带compact,调整高水位并释放收回的空间。此过程需要在表上加X锁,
会造成表上的所有DML语句阻塞。在业务特别繁忙的系统上可能造成比较大的影响。对于大表,建议采用compact选项
*/
oracle shrink
最新推荐文章于 2024-02-20 14:01:56 发布