记一次删除oracle高水位线问题

文章讲述了在Oracle数据库操作中遇到的高水位问题,包括删除一年前数据到新表并从原表删除的流程。作者遇到了对有Long类型字段的表执行shrinkspace操作时的错误,通过将Long字段转换为CLOB类型,然后删除函数式索引,最终成功执行删除高水位的空间收缩。
摘要由CSDN通过智能技术生成

最近在oracle生产上删除数据以及高水位时,发现一些问题, 在此记录一下

业务要求是,备份一年前的数据到另一个新表,同时删除当前表一年前的数据,给旧数据“搬家”,当然是先执行insert…select,再来delete,后面再删除高水位。

什么是“高水位”,官方叫high water mark,在进行DML的时候,高水位线会增长,进行delete的时候并不会降低高水位线,oracle在进行select的时候,会从高水位线以下的块去查询,不及时释放已删除数据的空间,当然会影响查询效率。

就好比电脑在删除文件的时候,硬盘空间并没有变少,要手动去回收站删除才能真正释放一个道理

知道这么一回事后,执行以下两个命令

-- 打开行移动功能
alter table TABLE_NAME enable row movement;
-- 删除高水位,cascade的意思是收缩表的同时收缩索引
alter table TABLE_NAME shrink space cascade;

第一次执行的时候报了这个错

异常信息:ORA-10662: Segment has long columns

在这里插入图片描述

原因是上述sql不支持对存在long类型字段的表进行压缩,
于是手动改成CLOB类型(Long类型也会逐渐被BLOB、CLOB和BFILE取代,建议能不用long就别用)

alter table TABLE_NAME MODIFY FIELD CLOB;

修改完字段类型,再次执行上面两条sql,又报错…
这次是

异常信息:ORA-10631: SHRINK clause should not be specified for this object

度娘告诉我,原来是存在函数式索引

在这里插入图片描述

查询索引sql如下

select i.uniqueness ,i.index_type,t.column_name , t.* from dba_ind_columns t,dba_indexes i where t.index_name = i.index_name and t.table_name = i.table_name and t.table_name = 'table_name'

既然如此,删除索引,用普通索引创建

DROP index IDX_AGGREGATE_ORDER_DEL_STATE;
create index index_name on table_name (field_name)

再次执行删除高水位sql,执行成功!
在这里插入图片描述

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值