gpt4 book ai didi

oracle - 移动分区时如何避免Oracle全局索引重建

转载 作者:行者123 更新时间:2023-12-03 21:36:31 27 4
gpt4 key购买 nike

定期地,我需要从一个表中分离分区并附加到不同表空间中的另一个表。

伪流:

  • 循环每个表和过期分区:

    1.1 在目标表中新建一个目标分区

    1.2 将分区移动到目标表空间

    1.3 将源分区交换为临时表

    1.4 与目标分区交换临时表

    1.5 删除源分区
  • 在源表中重建全局索引
  • 在目标表中重建全局索引

  • 问题是,重建索引使索引暂时不可用,在我的情况下支持实时应用程序是 Not Acceptable 。

    索引重建是一项昂贵的操作,避免这种情况的一种方法是强制执行异步全局索引维护,这会使全局索引孤立,但无需任何重建即可使用。但是,孤儿索引只能在 Partition Drop 和 Partition Truncate 操作中启用。在上面的流程中,全局索引在 Partition Move 和 Partition Exchange 操作中变为 UNUSABLE。最后一条语句中的分区删除不能再强制执行孤立索引。

    这令人沮丧,因为我知道分区最终会被删除,但我仍然有义务重建全局索引。你能建议避免索引重建吗?

    笔记:
  • 我可以在 Partition Move 中使用 UPDATE GLOBAL INDEXES 子句和
    分区交换条款,但它是昂贵的,它会
    在循环中多次调用。
  • 我可以将全局索引更改为本地索引,但这将有
    对我们的应用程序产生更大的性能影响。此外,独一无二
    索引不起作用(不涉及分区键)。
  • 最佳答案

    一种可能的方法是将要从 ACT 移动的分区复制到 TMP 表中(在所需的表空间中使用 CTAS),然后

  • 将TMP表与HIST表的分区交换,
  • 删除 ACT 表中的分区。

  • 这种方法启用异步全局索引维护,但不知何故,移动是分两步完成的,因此理论上可能存在同时查看分区或不查看分区的查询(取决于两个步骤的顺序)。如果这是一个问题,那么一些额外的注意(例如应该采取锁定 HIST 表)。

    这是使用 INTERVAL PARTITONING 的示例(表设置如下)。
    -- step 1 copy the partition to be moved from ACT table
    create table tmp as
    select * from t_act partition FOR (TO_DATE('2016-02-21', 'YYYY-MM-DD'));

    -- step 2 allocate partition in HIST table
    LOCK TABLE t_hist
    PARTITION FOR (TO_DATE('2016-02-21', 'YYYY-MM-DD'))
    IN SHARE MODE;


    -- step 3 publish the copy in HIST table and DROP the ACT partition
    ALTER TABLE t_hist
    EXCHANGE PARTITION FOR (TO_DATE('2016-02-21', 'YYYY-MM-DD'))
    WITH TABLE tmp
    INCLUDING INDEXES;

    alter table t_act drop partition FOR (TO_DATE('2016-02-21', 'YYYY-MM-DD')) UPDATE INDEXES;

    表设置
    drop  TABLE t_act;
    CREATE TABLE t_act
    (id number,
    transaction_date DATE not null,
    vc_pad VARCHAR2(100)
    )
    PARTITION BY RANGE (transaction_date)
    INTERVAL (NUMTODSINTERVAL(1,'DAY'))
    (
    PARTITION P_01 VALUES LESS THAN (TO_DATE('2016-02-22', 'YYYY-MM-DD') ),
    PARTITION P_02 VALUES LESS THAN (TO_DATE('2016-02-23', 'YYYY-MM-DD') )
    );

    ALTER TABLE t_act ADD CONSTRAINT t_act_pk PRIMARY KEY (id);
    create index t_act_ix1 on t_act(transaction_date);

    drop TABLE t_hist;
    CREATE TABLE t_hist
    (id number,
    transaction_date DATE not null,
    vc_pad VARCHAR2(100)
    )
    PARTITION BY RANGE (transaction_date)
    INTERVAL (NUMTODSINTERVAL(1,'DAY'))
    (
    PARTITION P_01 VALUES LESS THAN (TO_DATE('2016-02-20', 'YYYY-MM-DD') ),
    PARTITION P_02 VALUES LESS THAN (TO_DATE('2016-02-21', 'YYYY-MM-DD') )
    );

    insert into t_act
    select rownum, TO_DATE('2016-02-21', 'YYYY-MM-DD') ,'TEST' from dual connect by level <= 100000;
    commit;

    关于oracle - 移动分区时如何避免Oracle全局索引重建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35292467/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com