zoukankan      html  css  js  c++  java
  • Oracle清理大表,降水位

    背景:一张表的清理机制存在问题,导致该表的数据一直在增加,该表水位已很高,需要对该表的数据进行清理并降水位。

    1.1 迁移前准备

    步骤一、新建表 p_transaction_bak。

    oracle@linux-nxv6:~/orcale > sqlplus test/test

    SQL> create table p_transaction_bak
    as
    select * from p_transaction where 1 = 0;
    SQL> alter table p_transaction_bak modify OPERATIONDATE DEFAULT sysdate;
    SQL> alter table p_transaction_bak modify INVALID DEFAULT 0;

    步骤二、有需要的有效数据插入新表中。

    SQL> alter session enable parallel dml;

    insert /*+ append parallel(p,8) */ into p_transaction_bak p select /*+ parallel(n,8) */ * from p_transaction n
    where to_char(n.operationdate, 'yyyy-mm-dd') between
    to_char(to_date('2016-06-27', 'yyyy-mm-dd'), 'yyyy-mm-dd') and
    to_char(to_date('2016-07-04', 'yyyy-mm-dd'), 'yyyy-mm-dd');

    commit;

    步骤三、为新表 p_transaction

    table创建主键和索引
    SQL> create unique index PK_PO_TRANSACTION_NEW on p_transaction_bak(STREAMINGID) tablespace portaloneindx parallel 8 online;
    SQL> alter table p_transaction_bak add constraint PK_PO_TRANSACTION_NEW primary key (STREAMINGID);
    SQL> alter index PK_PO_TRANSACTION_NEW noparallel;
    SQL> create index ix_transaction_operationdate on p_transaction_bak(operationdate) tablespace portaloneindx parallel 8 online;
    SQL> alter index ix_transaction_operationdate noparallel;

    ----End

    1.2 执行数据迁移

    步骤一、停应用

    步骤二、以SYSDBA用户登录数据库。

    oracle@linux-nxv6:~/orcale > sqlplus / as sysdba

    步骤三、检查数据表空间和索引表空间使用率。

    SQL>select total.tablespace_name,
    round(total.MB, 2) as Total_MB,
    round(total.MB - free.MB, 2) as Used_MB,
    round((1 - free.MB / total.MB) * 100, 2) || '%' as Used_Pct
    from (select tablespace_name, sum(bytes) / 1024 / 1024 as MB
    from dba_free_space
    group by tablespace_name) free,
    (select tablespace_name, sum(bytes) / 1024 / 1024 as MB
    from dba_data_files
    group by tablespace_name) total
    where free.tablespace_name = total.tablespace_name;

    步骤四、并行将数据插入新表。

    SQL> alter session enable parallel dml;

    insert /*+ append parallel(p,8) */ into p_transaction_bak p select /*+ parallel(n,8) */ * from p_transaction n
    where to_char(n.operationdate, 'yyyy-mm-dd') =
    to_char(to_date('2016-07-05', 'yyyy-mm-dd'), 'yyyy-mm-dd');

    commit;

    步骤五、备份旧表。

    SQL> rename p_transaction to p_transaction_old;

    步骤六、重命名新表。

    SQL> rename p_transaction_bak to p_transaction;

    ----End

    1.3 回滚以上操作 oracle@linux-nxv6:~/ orcale > sqlplus test/test

    SQL>rename p_transaction to p_transaction_new;
    SQL>rename p_transaction_old to p_transaction;
    SQL>truncate table p_transaction_new;
    SQL>drop table p_transaction_new;

    ----End

  • 相关阅读:
    hdoj 1029
    喵哈哈村的魔法考试 Round #5 (Div.2) B
    喵哈哈村的魔法考试 Round #6 (Div.3) E
    喵哈哈村的魔法考试 Round #6 (Div.3) BC总结
    喵哈哈村的魔法考试 Round #7 (Div.2) E
    喵哈哈村的魔法考试 Round #7 (Div.2) C
    喵哈哈村的魔法考试 Round #7 (Div.2) B
    喵哈哈村的魔法考试 Round #7 (Div.2)
    Codeforces Round #402 (Div. 2) --- C. Dishonest Sellers
    Codeforces Round #402 (Div. 2)---B. Weird Rounding
  • 原文地址:https://www.cnblogs.com/zihanxing/p/6852695.html
Copyright © 2011-2022 走看看