oracle怎么大量删除表里数据,按时间维度来删除

MoYunHui1 2020-03-11 08:33:18
以前都是用delete这样的来删除几条数据,没有接触过这样大量删除,现在有点无能为力,麻烦大佬们帮帮忙
有张表为: INTERFACE_FROM_LOG,有1000多W数据
想按照:REQUEST_TIME 这个时间字段小于2020-01-01这个条件来删除
请问大佬具体sql该怎么写呢?
...全文
1671 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_38931086 2020-09-10
  • 打赏
  • 举报
回复
declare cursor ID_KEY_CURSOR is
   SELECT t.senddate senddate from ICDRPT.SUM_PROVINCE_BUSINESS_H15 t where substr(t.senddate,1,8) < '20190101'; 
begin
    for V_TO_DEL in ID_KEY_CURSOR loop
        DELETE FROM ICDRPT.SUM_PROVINCE_BUSINESS_H15
		 WHERE ICDRPT.SUM_PROVINCE_BUSINESS_H15.SENDDATE = V_TO_DEL.senddate;
    if mod(ID_KEY_CURSOR%Rowcount, 5000) = 0
        then commit;
    end if;
    end loop;
    commit;
end;
  • 打赏
  • 举报
回复
还是建议改成时间分区或者你可以直接使用interval 分区。。。。维护非常方便。 delete方式很容易产生性能问题。试想哪天突然delete失败了,要回滚。。。
lzhw8811282 2020-03-30
  • 打赏
  • 举报
回复
分区表怎么删除数据和不分区表是不是不一样
  • 打赏
  • 举报
回复
你这个表太适合用分区表了。 不用就是给自己找麻烦。
  • 打赏
  • 举报
回复
1、我可不可以先将大于这个时间的放在一张新表,然后删除这个表,再将新表的名字改成这个表。 2、如果是按照时间分区的,我写匿名块,删除分区的数据就行了。 如果这两个方法不行,你就delete吧。
lhdz_bj 2020-03-25
  • 打赏
  • 举报
回复
1、删除大量数据,最好是通过drop partition或truncate partition来操作;
2、按照楼主的意思,应该是删除表中的大部分数据,就是删除2020年1月1号之前的所有数据,其实,如果服务器性能还可以的话,直接delete from INTERFACE_FROM_LOG where REQUEST_TIME<'2020-01-01';
否则,就得想办法,比如:
alter table INTERFACE_FROM_LOG rename to INTERFACE_FROM_LOG_bak;
create table INTERFACE_FROM_LOG as select * from from INTERFACE_FROM_LOG where REQUEST_TIME>='2020-01-01';
关键看删除多少数据。
xiaoguanzhao 2020-03-21
  • 打赏
  • 举报
回复
创建一张同结构临时表,把大于等于20200101的数据存到临时表中,查看存放数据是否正确,把原表truncate掉,再把临时表数据插回原表,三个月不到的数据很快的,后面操作这张表也会快很多
ruanjianxuqiu126 2020-03-16
  • 打赏
  • 举报
回复
用临时表把主键记录下来,然后用游标循环临时表的数据去删除源表,每次就是删一条记录,一定数量commit一次,这样就不会占用了
AHUA1001 2020-03-13
  • 打赏
  • 举报
回复
简单粗暴一点,按照时间加分区,需要删数据的时候,直接删除分区。
卖水果的net 2020-03-13
  • 打赏
  • 举报
回复
分批删除就行了,每次删除10000行,删除完成马上执行一个 commit ;
MoYunHui1 2020-03-13
  • 打赏
  • 举报
回复
引用 9 楼 数据装进口袋 的回复:
delete数据太多回滚段会不够用而且都是逐行操作很慢,就算按楼主的分步提交delete还是慢,直接绕过delete好了
大佬意思是先把要需要保留的查处来然后放到一个临时表里,然后删除原表,在把保留的读取回原表吗
miqi_oracle 2020-03-13
  • 打赏
  • 举报
回复
如果长期有这个操作需求还是考虑建分区表比较好,就按你的删选条件分
miqi_oracle 2020-03-13
  • 打赏
  • 举报
回复
delete数据太多回滚段会不够用而且都是逐行操作很慢,就算按楼主的分步提交delete还是慢,直接绕过delete好了
miqi_oracle 2020-03-13
  • 打赏
  • 举报
回复
不用delete
1、CREATE TABLE INTERFACE_FROM_LOG_BAK AS SELECT * FROM INTERFACE_FROM_LOG WHERE REQUEST_TIME >= '2020-01-01';--select看一下保留的数据有没有问题
2、DROP TABLE INTERFACE_FROM_LOG;
3、CREATE TABLE INTERFACE_FROM_LOG AS SELECT * FROM INTERFACE_FROM_LOG_BAK ;
modb_pro 2020-03-13
  • 打赏
  • 举报
回复
给你提供一个思路,如果删除表中的大部分数据,可以CTAS新表把需要保留的数据插入到新表中,然后再通过rename方式切换下。
MoYunHui1 2020-03-12
  • 打赏
  • 举报
回复
如果直接delete,导致内存还是被占用呢,这个该怎么解决呢?
weixin_42216833 2020-03-12
  • 打赏
  • 举报
回复
本人新手小白,LZ试试这样行不行,分时间段删除 delete from interface_from_log where request_time between to_date('2018-01-01 00:00:00','yy-mm-dd hh24:mi:ss') and to_date('2020-01-01','yy-mm-dd hh24:mi:ss')
wildwolv 2020-03-12
  • 打赏
  • 举报
回复
没看懂,一千多万有什么关系,一样delete
MoYunHui1 2020-03-12
  • 打赏
  • 举报
回复
大佬们,帮帮忙

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧