清理oracle库30亿的表后,释放删除空间

2023-12-13 21:17:30

1.创建中间表

请以HADES_COD.HDS_COD_BUSI_DETAIL为模板,
手动创建中间表:HADES_COD.HDS_COD_BUSI_DETAIL_1
以及它的constraint约束
示例:

-- Create table
create table HADES_COD.HDS_COD_BUSI_DETAIL_1
(
? id ? ? ? ? ? ? ? ? ? ? ? ? ? ?NUMBER not null,
? wo_code ? ? ? ? ? ? ? ? ? ? ? VARCHAR2(100),
? order_code ? ? ? ? ? ? ? ? ? ?VARCHAR2(100),
? arrv_address ? ? ? ? ? ? ? ? ?VARCHAR2(200),
? ...
? adjust_orig_wo_code ? ? ? ? ? VARCHAR2(100),
? arrv_month_verf_corp_name ? ? VARCHAR2(200)
)
tablespace NNC_DATA01
? pctfree 10
? initrans 1
? maxtrans 255
? storage
? (
? ? initial 256K
? ? next 256K
? ? minextents 1
? ? maxextents unlimited
? ? pctincrease 0
? );

-- Create/Recreate primary, unique and foreign key constraints?
alter table HADES_COD.HDS_COD_BUSI_DETAIL_1
? add constraint P_HDS_COD_BUSI_DETAIL primary key (ID)
? using index?
? tablespace NNC_INDEX01
? pctfree 10
? initrans 2
? maxtrans 255
? storage
? (
? ? initial 256K
? ? next 256K
? ? minextents 1
? ? maxextents unlimited
? ? pctincrease 0
? );

2.验证是否支持在线重定义

exec dbms_redefinition.can_redef_table('HADES_COD','HDS_COD_BUSI_DETAIL');

3.映射字段类型,启动重定义进程

begin?
dbms_redefinition.start_redef_table?
(
uname ? ? ?=> 'HADES_COD',
orig_table => 'HDS_COD_BUSI_DETAIL',
int_table ?=> 'HDS_COD_BUSI_DETAIL_1'
);
end;
/

4.异步同步数据

begin?
dbms_redefinition.sync_interim_table?
(
uname ? ? ?=> 'HADES_COD',
orig_table => 'HDS_COD_BUSI_DETAIL',
int_table ?=> 'HDS_COD_BUSI_DETAIL_1'
);
end;
/

5.完成在线重定义

begin?
dbms_redefinition.finish_redef_table?
(
uname ? ? ?=> 'HADES_COD',
orig_table => 'HDS_COD_BUSI_DETAIL',
int_table ?=> 'HDS_COD_BUSI_DETAIL_1'
);
end;
/

6.(可选项)取消在线重定义

【仅供执行报错的时候,取消任务使用】
begin?
dbms_redefinition.abort_redef_table?
(
uname ? ? ?=> 'HADES_COD',
orig_table => 'HDS_COD_BUSI_DETAIL',
int_table ?=> 'HDS_COD_BUSI_DETAIL_1'
);
end;
/

7.收集统计信息

exec dbms_stats.GATHER_TABLE_STATS(ownname => 'HADES_COD',tabname => 'HDS_COD_BUSI_DETAIL',CASCADE => true,degree => 35);

8.创建索引

按原表的索引情况,自行创建其他索引(通过online parallel 4并行创建索引)
如:
create unique index HADES_COD.HDS_COD_BUSI_DETAIL_01 on HADES_COD.HDS_COD_BUSI_DETAIL (WO_CODE)
online parallel 4
? tablespace NNC_INDEX01
? pctfree 10
? initrans 2
? maxtrans 255
? storage
? (
? ? initial 256K
? ? next 256K
? ? minextents 1
? ? maxextents unlimited
? ? pctincrease 0
? );

9.清理中间表

drop table HADES_COD.HDS_COD_BUSI_DETAIL_1 purge;

此种方式为在线重定义表的形式来释放已删除的空间,影响范围小、速度快,单表删除3亿的数据后,3~4小时即可完成全部的释放动作。

另外一种释放的方式为:

alter table HADES_COD.HDS_COD_BUSI_DETAILenable row movement nologging parallel 4;
alter table HADES_COD.HDS_COD_BUSI_DETAILshrink space COMPACT;
alter table HADES_COD.HDS_COD_BUSI_DETAILshrink space cascade;
alter table HADES_COD.HDS_COD_BUSI_DETAILdisable row movement noparallel logging;

此种方式较上面的方式要慢很多,开始运行后,只能傻等,大概需要20个小时的时间。

文章来源:https://blog.csdn.net/jato333/article/details/134846114
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。