oracle中如何删除亿级数据

目录
  • oracle删除亿级数据
    • 1、drop table ,然后再create table,插入数据
    • 2、使用delete批量删除
    • 3、使用truncate table ,然后再插入数据
  • oracle数据库亿级数据量清理SQL优化常识
    • 第一种方法就是DELETE
    • 第二种方法就是truncate
    • 删除的第三种方式就是DROP
  • 总结

oracle删除亿级数据

近期遇到一个日志表记录了几年数据,数据量较大(几亿数据),导致查询等操作较慢,为了提高效率,决定删除部分历史数据,想了三种方法如下:

通用步骤(每种方法之前先运行以下备份脚本):

1、备份 2021年之前数据

create table table_log_b2020 as  select * from table_log a where a.logtime<date'2021-1-1';

2、备份2021年数据

create table table_log_2021 as  select * from table_log a where a.logtime>=date'2021-1-1';

1、drop table ,然后再create table,插入数据

1、drop table

drop table table_log 

2、create table table_log

3、插入2021年数据

insert into table_log select * from table_log_b2021;

2、使用delete批量删除

1、先去掉表索引,因为索引可能会影响删除效率

2、批量执行删除语句,也可以以存过方式直接运行,按照数量删除

delete  from table_log a  where a.logtime<date'2021-1-1' and rownum<5000000

每500万一次,没去索引之前大约耗时85秒,删掉索引之后大约耗时50

3、使用truncate table ,然后再插入数据

1、truncate table

truncate  table table_log   耗时0.5s

2、插入2021年数据

insert into table_log   select * from table_log_b2021;  耗时 0.095s

第一种涉及到删表结构,公司相关规定不可这么做,第二种效率较为低

综合考虑使用了第三种,效率较为可观 ,秒秒钟把数据干干净。

oracle数据库亿级数据量清理SQL优化常识

#ORACLE #SQL #亿级数据量清理优化

说到删除数据,想到的

第一种方法就是DELETE

确实对于清理数据量比较少的表来说,DELETE是简单直接的方法,但是对于上亿条数据的表来说,这种方式肯定是行不通的,会造成undo表空间的不足。

第二种方法就是truncate

但是我们这里做的是删除表中的部分数据,而不是清空表数据,所以也不能直接truncate,既然不能全部truncate,我们一开始想到的方式是先创建一个临时表,把需要保留的数据拿出来,然后清空表数据只会,再把需要保留的数据放回去,最后删除临时表,这种方式就不会造成undo表空间不足了,但是这样效率很慢,时间很长,从二十亿的数据量中删除一半左右的数据需要八个小时,当然这个和服务器的性能等硬件也有关系,如下如所示的SQL,虽然能够删除成功,但是速度很慢。

 CREATE TABLE SYSADM.PS_GPCN_PAYEE_TBL2022 AS
 SELECT *
  FROM SYSADM.PS_GPCN_PAYEE_TBL
 WHERE EMPLID IN (
 SELECT EMPLID3
  FROM PS_C_PAY_TBL)/ COMMIT/ TRUNCATE TABLE SYSADM.PS_GPCN_PAYEE_TBL/
 INSERT INTO SYSADM.PS_GPCN_PAYEE_TBL NOLOGGING
 SELECT *
  FROM SYSADM.PS_GPCN_PAYEE_TBL2022/ COMMIT/
 DROP TABLE SYSADM.PS_GPCN_PAYEE_TBL2022/ COMMIT/

删除的第三种方式就是DROP

直接把表干掉,drop的速度要比truncate更快,如果drop掉表之后再create,表还不会生成索引,所以如果采用drop的方式,就还要创建索引,这种方式只需要一个小时左右的时间

 CREATE TABLE SYSADM.PS_GP_ITER_TRGR2022 AS
 SELECT *
  FROM SYSADM.PS_GP_ITER_TRGR
 WHERE EMPLID IN (
 SELECT EMPLID3
  FROM PS_C_PAY_TBL)/ COMMIT/
 DROP TABLE SYSADM.PS_GP_ITER_TRGR/
 CREATE TABLE SYSADM.PS_GP_ITER_TRGR AS
 SELECT *
  FROM SYSADM.PS_GP_ITER_TRGR2022 /
 CREATE INDEX PSAGP_ITER_TRGR ON PS_GP_ITER_TRGR (CAL_RUN_ID
 , EMPLID
 , ITER_TRGR_STATUS) tablespace PSINDEX pctfree 10 initrans 2 maxtrans 255 storage ( initial 48K NEXT 112K minextents 1 maxextents unlimited )/
 CREATE INDEX PS_GP_ITER_TRGR ON PS_GP_ITER_TRGR (EMPLID
 , CAL_RUN_ID
 , ITER_TRGR_STATUS) tablespace PSINDEX pctfree 10 initrans 2 maxtrans 255 storage ( initial 80K NEXT 112K minextents 1 maxextents unlimited )/
 DROP TABLE SYSADM.PS_GP_ITER_TRGR2022/ COMMIT/

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • oracle数据库的删除方法详解

    1.图形界面删除 练习之前记得创建快照 执行命令之前要保证数据库属于open状态 SQL> alter database open; [oracle@localhost ~]$ dbca 2.静默删除 使用DBCA进行删除的数据库必须处于OPEN状态,否则不能删除. SQL> alter database open; [oracle@localhost ~]$ dbca -silent -deleteDatabase -sourceDB OCPLHR1 3.SQL窗口 startup ##启动

  • oracle 批量删除表数据的几种方法

    1.情景展示 情景一: 删除PRIMARY_INDEX_TEST表中,MINDEX_ID字段为空的数据 情景二: 删除VIRTUAL_CARD_TEST表中的脏数据 2.解决方案 情景一的解决方案: DELETE FROM PRIMARY_INDEX_TEST WHERE MINDEX_ID IS NULL 情景二的解决方案: 方案1:使用快速游标法(删除一次提交一次): --快速游标法 BEGIN FOR TEMP_CURSOR IN (SELECT ID FROM VIRTUAL_CARD3

  • Oracle中大批量删除数据的方法

    写一个循环删除的过程. create or replace procedure delBigTab(p_TableName in varchar2,p_Condition in varchar2,p_Count in varchar2)  as pragma autonomous_transaction; n_delete number:=0; begin  while 1=1 loop EXECUTE IMMEDIATE 'delete from '||p_TableName||' where

  • oracle中如何删除亿级数据

    目录 oracle删除亿级数据 1.drop table ,然后再create table,插入数据 2.使用delete批量删除 3.使用truncate table ,然后再插入数据 oracle数据库亿级数据量清理SQL优化常识 第一种方法就是DELETE 第二种方法就是truncate 删除的第三种方式就是DROP 总结 oracle删除亿级数据 近期遇到一个日志表记录了几年数据,数据量较大(几亿数据),导致查询等操作较慢,为了提高效率,决定删除部分历史数据,想了三种方法如下: 通用步骤

  • oracle中添加删除主键的方法

    1.创建表的同时创建主键约束 (1)无命名 create table student ( studentid int primary key not null, studentname varchar(8), age int); (2)有命名 create table students ( studentid int , studentname varchar(8), age int, constraint yy primary key(studentid)); 2.删除表中已有的主键约束 (1

  • Oracle中手动删除数据库教程

    在很多情况下,或无法使用dbca工具的时候,我们需要手动来删除数据库.对此,可以借助drop database命令来实现,下面的描述中给出手动删除数据库. 的具体步骤,包含文件系统数据库以及ASM数据库.环境:Oracle Enterprise Linux 5.4 + Oracle 10g R2 .   一.手动删除文件系统数据库       1.停止监听与OEM 复制代码 代码如下: $ lsnrctl stop listener_name         $ emctl stop dbcon

  • Oracle删除重复的数据,Oracle数据去重复

    Oracle  数据库中查询重复数据: select * from employee group by emp_name having count (*)>1;  Oracle  查询可以删除的重复数据 select t1.* from employee t1 where (t1.emp_name) in (SELECT t2.emp_name from employee t2 group by emp_name having count (*)>1) and t1.emp_id not in

  • oracle中截断表的使用介绍

    在Oracle中如果删除了表中的某一条数据,还可以通过回滚操作(rollback)进行回滚,假如想清空一张 表的数据,但是又不想使其能进行回滚操作,就可以立刻释放资源,这时就需要使用截断表了.它的主要功能就是彻底删除数据,使其不能进行回滚.这里我打个比方大家就立刻能明了它的作用.大家众所周知,当我们在自己的PC(personcomputer)上删除某一个文件,它并没有彻底删除而是进入了回收站,你要在回收站中再将其删除才算彻底清除.截断表就相当于直接将数据从pc上删除,而不会放入回收站. 截断表格

  • Oracle中简单查询、限定查询、数据排序SQL语句范例和详细注解

    一.简单查询 SQL(Structured Query Language) 结构化查询语言,是一种数据库查询和程序设计语言,用于存取数据以及查询.更新和管理关系数据库系统.ANSI(美国国家标准学会)声称,SQL是关系数据库管理系统的标准语言. Oracle数据库之所以发展的很好,主要也是因为Oracle是全世界最早采用SQL语句的数据库产品. SQL功能强大,概括起来,它可以分成以下几组: 复制代码 代码如下: DML(Data Manipulation Language) 数据操作语言,用于

  • Oracle中多表关联批量插入批量更新与批量删除操作

    该文章会分为三部分 1.多表关联批量插入 2.多表关联批量更新 3.多表关联批量删除 首先要明白一点,为什么会有批量这一个概念,无非就是数据太多了,在java端把数据查出来然后在按照100-300的批次进行更新太耗性能了,而且写出来的代码会非常的臃肿,所谓好的实现是用最少的,最精简的代码实现需求,代码越少,留给自己犯错误的机会更少. 还有一个知识点就是多表关联,对于查询肯定是可以多表关联的,其实对于除了查询之外也是可以进行多表关联过滤数据的,从而达到在Oracle中查到目标数据即可更新,从而规避

  • oracle取数据库中最新的一条数据可能会遇到的bug(两种情况)

    记一次 开发中遇到的坑: 第一种情况 rowid select * from table where rowid=(select max(rowid) from table ) 这种方式是取最大的rowid作为最新的数据,但是有一个隐患 :数据库一旦有删除操作,rowid不能保证每次都是递增的!即max(rowid)并不一定就是最新的数据,尽管可能不会每次复现 但这个问题是绝对存在的! 第二种情况 使用rownum (或相同思路) select t.* from (select ti.sysno

  • oracle中commit之后进行数据回滚的方法

    commit之后 第一种: 记住大概的时间,获取前大概时间的数据. select * from Test as of timestamp to_timestamp('2021-12-08 09:30:56','yyyy-mm-dd hh24:mi:ss'); 上面的代码就可以查看你要恢复的时间点的记录,看看是不是有你想要的刚刚提交的DML相关记录. 能看到,剩下的就简单了,可以把现在表中的数据备份到一个临时表,然后把记录插进去原表就行了 不要用truncate删除,不然你就回不去了,到时候你就又

随机推荐