zoukankan      html  css  js  c++  java
  • Oracle12c中性能优化&功能增强新特性之全局索引DROP和TRUNCATE 分区的异步维护

    Oracle 12c中,通过延迟相关索引的维护可以优化某些DROP和TRUNCATE分区命令的性能,同时,保持全局索引为有效。

    1.   设置

    下面的例子演示带全局索引的表创建和加载数据的过程。

    -- 建表

    CREATE TABLE t1

    (id            NUMBER,

     comment   VARCHAR2(50),

     crt_time  DATE)

    PARTITION BY RANGE (crt_time)

    (PARTITION part_14 VALUES LESS THAN (TO_DATE('01/01/2015', 'DD/MM/YYYY'))TABLESPACE users,

     PARTITION part_15 VALUES LESS THAN(TO_DATE('01/01/2016', 'DD/MM/YYYY')) TABLESPACE users);

     

    ALTER TABLE t1 ADD CONSTRAINT t1_pk PRIMARY KEY (id);

    CREATE INDEX t1_idx ON t1 (crt_time);

     

    --加载数据

    INSERT /*+ APPEND */ INTO t1

    SELECT level,

           'commit for ' || level,

           CASE

             WHEN MOD(level,2) = 0 THENTO_DATE('01/07/2014', 'DD/MM/YYYY')

             ELSE TO_DATE('01/07/2015','DD/MM/YYYY')

           END

    FROM   dual

    CONNECT BY level <= 10000;

    COMMIT;

     

    EXEC DBMS_STATS.gather_table_stats(USER, 't1');

     

    -- 检查索引

    COLUMN table_name FORMAT A20

    COLUMN index_name FORMAT A20

     

    SElECT table_name,

           index_name,

           status

    FROM   user_indexes

    ORDER BY 1,2;

     

    TABLE_NAME           INDEX_NAME           STATUS

    -------------------- -------------------- --------

    T1                   T1_IDX               VALID

    T1                   T1_PK                VALID

    SQL>

    2.    全局索引异步维护

    现在,DROP和TRUNCATE PARTITION命令和UPDATE_INDEXES一起使用时,只会导致相关元数据的变化。该功能目前只能用于堆表,不支持对象表,域索引或SYS用户的对象。

    实际的索引维护稍后被执行,当满足如下之一的条件时。

    • SYS.PMO_DEFERRED_GIDX_MAINT_JOB作业每天2点被调度时。
    • 通过 DBMS_SCHEDULER.RUN_JOB手工运行SYS.PMO_DEFERRED_GIDX_MAINT_JOB时。
    • 运行DBMS_PART.CLEANUP_GIDX过程时。
    • 运行ALTER INDEX REBUILD [PARTITION]命令时。
    • 运行ALTER INDEX [PARTITION] COALESCE CLEANUP命令时。

    Oracle12c前,如果我们DROP或TRUNCATE了一个分区,将会导致全局索引失效,UPDATE_INDEXES子句会导致操作期间索引重建,使得整个操作变慢。下例中,我们TRUNCATE一个分区,然后查看索引状态。

    -- Truncate一个分区

    ALTER TABLE t1 TRUNCATE PARTITIONpart_2014 DROP STORAGE UPDATE INDEXES;

    ALTER TABLE t1 DROP PARTITION part_2014UPDATE INDEXES;

     

    -- 查看索引状态

    SElECT table_name,

          index_name,

          status

    FROM  user_indexes

    ORDER BY 1,2;

     

    TABLE_NAME           INDEX_NAME           STATUS

    -------------------- ----------------------------

    T1                   T1_IDX               VALID

    T1                   T1_PK                VALID

     

    SQL>

    视图USER_INDEXE中ORPHANED_ENTRIES新列显示索引还没被维护。

    -- 检查是否需要索引维护

    SELECT index_name,

          orphaned_entries

    FROM  user_indexes

    ORDER BY 1;

     

    INDEX_NAME           ORP

    -------------------- ---

    T1_IDX               YES

    T1_PK                YES

     

    SQL>如果我们手工触发索引维护,我们将会看到ORPHANED_ENTRIES列的变化

    -- 手工触发索引维护

    EXECDBMS_PART.cleanup_gidx(USER, 't1');

    -- 查看是否需要索引维护

    SELECT index_name,

           orphaned_entries

    FROM   user_indexes

    ORDER BY 1;

    INDEX_NAME           ORP

    -----------------------

    T1_IDX               NO

    T1_PK                NO

    SQL>

  • 相关阅读:
    深入理解计算机系统 第六章 存储器层次结构 第二遍
    深入理解计算机系统 第六章 存储器层次结构
    深入理解计算机系统 第八章 异常控制流 Part2 第二遍
    深入理解计算机系统 第八章 异常控制流 part2
    深入理解计算机系统 第八章 异常控制流 Part1 第二遍
    深入理解计算机系统 第八章 异常控制流 part1
    深入理解计算机系统 第三章 程序的机器级表示 Part2 第二遍
    深入理解计算机系统 第三章 程序的机器级表示 part2
    深入理解计算机系统 第三章 程序的机器级表示 Part1 第二遍
    深入理解计算机系统 第三章 程序的机器级表示 part1
  • 原文地址:https://www.cnblogs.com/lhdz_bj/p/8990769.html
Copyright © 2011-2022 走看看