java 批量删除数据_一种批量删除数据的方法
这两天碰见一个比较紧急的生产问题,由于还在处理中,所以暂时不能给出整体描述,但其中涉及的一个问题就是删除一张大表中的过期历史数据,针对不同的类型的表可能有不同的解决方法,比如若是按照时间做的分区表,drop partition删除分区的操作可能是效率最快的、最简单的,若是一张普通表则需要有一些索引键值为删除条件,但需要注意的是最好做批量删除,且一次删除量不要太多,因为delete操作会将数据前镜像保存在UNDO回滚表空间,由于占用过多、事务过大、执行时间过长、UNDO空间过小等一系列问题存在,就有可能会影响正常的交易操作,这话题不是今天的主题。
删除历史数据可以使用存储过程,也可以写一个程序来做,区别是存储过程是直接在数据库中操作,少了客户端和数据库交互的环节,若是需要一些复杂的校验逻辑,可能写程序要更方便一些,但也不是绝对的,可能有人认为存储过程更好,无论什么方式,能解决问题才是最重要。
eygle大神曾经提供过一个用于批量删除数据的存储过程,在这引用下,版权还是eygle的:),(http://www.eygle.com/archives/2005/04/oracleoeouaeeae.html),强调的就是:分批删除,逐次提交。
create or replace procedure delBigTab( p_TableName in varchar2, p_Condition in varchar2, p_Count in varchar2 )aspragma autonomous_transaction;n_delete number:=0;begin
while 1=1 loop
EXECUTE IMMEDIATE'delete from '||p_TableName||' where '||p_Condition||' and rownum <= :rn'USING p_Count;if SQL%NOTFOUND thenexit;elsen_delete:=n_delete + SQL%ROWCOUNT;end if; commit;end loop; commit; DBMS_OUTPUT.PUT_LINE('Finished!'); DBMS_OUTPUT.PUT_LINE('Totally '||to_char(n_delete)||' records deleted!');end; /
这是一可以有参数输入的存储过程,分别是:
p_TableName:待删除表的表名,
p_Condition:删除条件,
p_Count:一次删除的记录条数,rownum,
而且用了自治事务pragma autonomous_transaction,存储过程使用commit结尾。
整个逻辑很清晰和透彻,想必各位稍微看看都能明白。
这篇文章中(http://blog.csdn.net/xyjnzy/article/details/6194177)还介绍了另一种更精细的方法,判断日志是否已经归档了,避免数据删除快于日志归档的速度,如果发现尚未完成切换,则sleep一下,等待切换完成,再做下一次删除。
针对我这个需求,有一些可以改动的地方,由于这张表是一个按照NUMBER值做hash的哈希分区表,所以从效率上看,还可以精确至每个hash分区来做删除,这点是建荣给的建议,另外例子中自治事务我觉得也是可以不用的,因此针对SQL语句可以改为如下:
delete from table partition (p1) where insert_time
即指定分区名称(这可以作为另一个参数),然后可以通过手工执行,依次用rn=100、1000、5000、10000等几个值来选择从时间和删除量可接受的范围。总结一下,
1.如果使用存储过程,或许可以不用自治事务。
2.可以将partition作为另一个参数。
3.由于这张表数据量太大,即使使用索引条件做count(*)操作时间都很久,因此暂时未知符合条件需要删除的记录条数,因此需要根据测试和时间需求,明确rownum使用的可行条数,选择小值则可能循环次数要多,选择大值则可能循环次数少,总之务必要分批删除、批量提交,避免delete子句对UNDO表空间的过大影响。
以上只是提供了删除历史记录的一种存储过程操作的方法,以及针对我的需求做的一些改进,至于会采用何种方法,可能还会根据得到的信息,有其他需要改进的地方,可能还会使用程序的方法,可能会使用这种存储过程,待完成后会再做总结了。
如果您觉得此篇文章对您有帮助,欢迎关注微信公众号:bisal的个人杂货铺,您的支持是对我最大的鼓励!共同学习,共同进步:)
java 批量删除数据_一种批量删除数据的方法相关推荐
- java解析comtrade文件_一种COMTRADE二进制数据文件的快速解析方法与流程
本发明涉及电子系统录波领域,更具体地,涉及一种COMTRADE二进制数据文件的快速解析方法. 背景技术: 近年来,随着电子技术的快速发展,电力系统暂态录波明显向高采样率.连续稳态记录和海量存储的趋势发 ...
- java dtu 采集程序_一种物联网用DTU数据采集方法与流程
本发明涉及物联网的技术领域,特别是DTU数据采集的技术领域. 背景技术: 联网是一种新兴的概念,要实现物联网需要大量的数据进行支持,这就不可避免的需要对各种数据接收.发送.处理.现有的数据采集方式较为 ...
- mysql批量删除进程_小程序批量删除云数据库里的数据
我们用云开发的云数据库存数据,难免会遇到数据过多,或者一些过时数据要删除的需求.之前云开发删除数据库只能一条条的删除.要想批量删除很麻烦,近期云开发推出了批量删除数据的方法.甚至可以稍微改造下实现数据 ...
- python向es写入大量数据_使用Python-elasticsearch-bulk批量快速向elasticsearch插入数据_李谦的博客-CSDN博客...
from elasticsearch import Elasticsearch from elasticsearch import helpers import pymysql import time ...
- 螺钉装弹垫平垫机器人_一种批量组装螺钉、弹垫、平垫的工装及使用方法_2
于螺钉托盘1开有数个盲孔1-1的面上,手持螺钉托盘1进行晃动, 短时间之后,由于每个盲孔1-1孔口倒角的结构设计.盲孔1-1特定深度设计及螺钉5螺帽 的重心作用,螺钉5会呈螺帽在下,螺杆在上阵列于盲孔 ...
- 螺钉装弹垫平垫机器人_一种批量组装螺钉、弹垫、平垫的工装及使用方法
一种批量组装螺钉.弹垫.平垫的工装及使用方法 [技术领域] [0001] 本发明涉及一种批量组装螺钉.弹垫.平垫的工装及使用方法,可快速实现将平垫 圈.弹簧垫圈.螺钉进行组合. [背景技术] [000 ...
- java添加坚挺_Java连载136-两种方式插入数据
一.插入数据 对于数据的增删改查都有两种可选的操作模式,一种是直接使用SQL语句进行增删改查,另一种是通过可更新的结果集对象间接增删改查.首先创建语句对象 Statement stmt = con.c ...
- hive解决数据倾斜问题_八种解决 Spark 数据倾斜的方法
有的时候,我们可能会遇到大数据计算中一个最棘手的问题--数据倾斜,此时Spark作业的性能会比期望差很多.数据倾斜调优,就是使用各种技术方案解决不同类型的数据倾斜问题,以保证Spark作业的性能. 数 ...
- namenode的元数据会被删除吗_从链表中删除数据的时间复杂度真的是O(1)吗?
本文转载自微信:小争哥(xiaozhengge0822),作者:小争哥 数组和链表作为最基础的数据结构,在面试的时候,经常会被问到.最常被问到的一个问题,那就是,对比一下数组和链表.如果你是Java工 ...
最新文章
- 阿里云服务器问题攻略
- 电子工程可以报考二建_非工程类专业可以报考二建吗?哪些省份不限制报考专业?...
- 【英语】Invest in Yourself
- XNA:2D图元与3D模型共存时的渲染问题
- hexo之next主题添加分类
- 苹果手机处理器_全球最强手机处理器诞生!苹果A14主频首超3GHz:性能秒杀华为/高通...
- paip.银行卡号的发卡行归属地查询
- 【题解】保安站岗[P2458]皇宫看守[LOJ10157][SDOI2006]
- 莽荒纪手游源码/服务端!
- 个人独资有限公司章程模板
- COMSOL中的基础概念
- 前端面试题集锦——算法
- 加法器php,全加器原理是什么
- ADPRL - 近似动态规划和强化学习 - Note 1 - Introduction
- java开源saas项目
- python-列表元素绝对值排序
- 【南梦宫】预设性背景跟随对象算法
- 笔记分享 | 免疫组化染色Protocol
- 手把手教你pfx证书转pem
- 数字图像处理之点运算---对数变换