zoukankan      html  css  js  c++  java
  • oracle大表删除数据方案

    需求简介:生产数据库一个表有27亿多数据,要删除其中其中2014年之前的历史数据(大约4亿左右),表信息:5个字段的主键、一个字段的单列索引、hash分区。

    数据库情况:每日1:00-9:00会跑增量数据程序,其他sql不能影响增量程序。(所以数据要在9:00-24:00之内跑完)

    解决方案1:

    delete /*+parallel(32)*/ from table_name where date<to_date('2014-01-01','yyyy-mm-dd');

      结果:删除了8个小时,才删除几千万,怕影响第二天增量程序,直接杀进程,进程杀完数据回滚了20多小时,第二天增量最终还是影响了。

    解决方案2(采用的):

    --1,建分区表(如果不是分区表可以create...select)
    
    --2,插入数据
    insert /*+parallel(32)*/ into table_name_new
    select /*+parallel(32)*/* from  table_name where date>=to_date('2014-01-01','yyyy-mm-dd');
    
    --3,创建索引
    create index index_name1 on table_neme_new(column1) parallel 32;
    
    --4,索引并发创建要关闭并行,这样在我们使用索引时会影响执行计划,也会消耗很多的资源。所以,我们需要对这个并行度进行修改,改成noparallel
    alter index index_name1 noparallel;
    
    --5,创建主键,由于创建主键不能开启并行,所以要先创建主键字段唯一索引,再创建主键
    create unique index pk_name1 on table_neme_new(column1,column2,...) parallel 32;
    alter index pk_name1  noparallel;
    alter table table_neme_new add constraint pk_name1 primary key(column1,column2,...);

    --6,核对数据量没问题,将老表rename其他名字,将新表rename老名字

      结果:插入数据3.5小时,建单列索引40分钟,建主键40分钟。达到可以接受范围。

  • 相关阅读:
    C# String 前面不足位数补零的方法
    bootstrap-wysiwyg这个坑
    PRECONDITION_FAILED
    JdbcTemplate in()传参
    Mysql Specified key was too long; max key length is 767 bytes
    获取两日期之前集合并转为String类型的集合
    SQL里的concat() 以及group_concat() 函数的使用
    spring boot如何打印mybatis的执行sql
    MockMvc 进行 controller层单元测试 事务自动回滚 完整实例
    找到 Confluence 6 的日志和配置文件
  • 原文地址:https://www.cnblogs.com/dongchao3312/p/12777782.html
Copyright © 2011-2022 走看看