Oracle 大表数据删除/清理方法小结

发布时间:2024-11-21 23:17

误删除U盘文件,USB数据恢复工具的使用方法 #生活技巧# #数码产品使用技巧# #数据恢复工具使用#

Oracle 大表数据删除/清理方法小结

©著作权归作者所有:来自51CTO博客作者Hehuyi_In_666的原创作品,请联系作者获取转载授权,否则将追究法律责任

costdown遇到了大量数据清理的需求,整理下基本思路及方法

一、 哪些表是大表

1. 按空间大小

       包含CLOB大小但不含索引大小,如果库很大,全库统计会比较耗时,可以增加并行或过滤条件,分批处理。

2. 按行数

注意如果没收集过统计信息或者已经不准,会与实际有差异。

整理好后交给开发,确认各大表是否可清理,需保存多久数据。

二、 清理分类

目前大致遇到以下几种场景:

1. 可以drop

备份表、临时表、已无用的表时间范围分区表:索引改为local索引后,按分区drop

2. 可以truncate

部分日志表

       注意对于大表(例如上百G的表)应该分次执行drop或者truncate,推荐方法参考: 海量数据表删除方案_ITPUB博客

3. 可以rename然后重建空表

可以暂停写入,不通过程序读取的表按业务要求看是否将最近几个月数据插回新表,插回后删除备份表或者不插回数据,几个月后删除备份表

4. 只能delete

这个属于绝大部分情况,后面单独讨论

5. 业务接口删除

业务关联性很强的表,不能简单按时间删除,需要由业务方编写删除程序或者使用标准接口,典型的案例就是ERP里的标准表。

三、 千万级以上大表如何delete

1. 直接删除的问题

耗时长,可能最终遇到ORA-1555报错产生大事务,从库可能出现高延迟,且中断回滚耗时极长可能阻塞业务其他DML操作undo表空间过度使用,可能影响到其他用户正常操作

分批删除并提交,将大事务化为小事务。另外,删除时注意归档及闪回日志产生量。

2. 按天删除数据

       首先需要在对应时间字段(由业务方提供)加索引,一天的数据量大概在一两百万的话问题不大,再多可能就得拆得更细些。

时间字段为时间类型(date,timestamp)时间字段为字符串类型(奇葩设计,但就是有)

3. 游标对比rowid批量删除

下面两个方法来自:Oracle库Delete删除千万以上普通堆表数据的方法 - AlfredZhao - 博客园

有部分调整,避免全表取数及循环判断时间,原代码请参考原文

删除2020年3-4月的数据,每1万行提交一次

3. 直接按rowid删除

4. 如何看delete释放了多少空间

注意,这个脚本的统计不包含LOB字段。 TOM大师脚本-show space 多个版本,谢谢大牛们_dnil27295的

        下面代码基于 exec show_space_1810 改了一下,原代码出现了两次Total Blocks和Total bytes,有点迷惑,调整了名字,同时简化了输出的内容。输出如下,可以看到释放空间约228G。

Oracle 大表数据删除/清理方法小结_大表delete

四、 分区化改造

       对于需要定期清理的表,建议在线重定义为分区表,提高删除效率。这又是一个很长的话题了:Oracle 利用在线重定义进行分区表转换_Hehuyi_In的换

参考

收藏 评论 举报

相关文章

网址:Oracle 大表数据删除/清理方法小结 https://www.yuejiaxmz.com/news/view/181731

相关内容

SQL Server大表如何快速删除数据
突发!Oracle数据库临时表空间不翼而飞,紧急应对指南揭秘
数据结构(C语言)线性表的创建、插入、删除等操作
大数据清洗随手记(一)
达梦数据库
Oracle查询优化改写技巧与案例2.0
MySQL 快速删除大量数据(千万级别)的几种实践方案——附源码
oracle 用户被锁定解锁方法
高效解决MySQL千万级大表数据清理难题的策略
oracle sql里 => :符号的意思

随便看看