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>

  • 相关阅读:
    IOS开发中UITableView(表视图)的滚动优化及自定义Cell
    IOS软件国际化(本地化Localizable)
    IOS三种归档(NSKeyArchieve)的总结
    在IOS中使用DES算法对Sqlite数据库进行内容加密存储并读取解密
    内存管理_缓存一致性
    JAVA volatile 关键字
    C++ STL 的实现:
    Java for LeetCode 236 Lowest Common Ancestor of a Binary Tree
    Java for LeetCode 235 Lowest Common Ancestor of a Binary Search Tree
    Java for LeetCode 234 Palindrome Linked List
  • 原文地址:https://www.cnblogs.com/lhdz_bj/p/8990769.html
Copyright © 2011-2022 走看看