首页 / 数据库 / MySQL / Oracle 12c中性能优化&功能增强新特性之全局索引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 INTO t1SELECT 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") ENDFROM dualCONNECT BY level <= 10000;COMMIT; EXEC DBMS_STATS.gather_table_stats(USER, "t1"); -- 检查索引COLUMN table_name FORMAT A20COLUMN index_name FORMAT A20 SElECT table_name, index_name, statusFROM user_indexesORDER BY 1,2; TABLE_NAME INDEX_NAME STATUS-------------------- -------------------- --------T1 T1_IDX VALIDT1 T1_PK VALIDSQL>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, statusFROM user_indexesORDER BY 1,2; TABLE_NAME INDEX_NAME STATUS-------------------- ----------------------------T1 T1_IDX VALIDT1 T1_PK VALID SQL>视图USER_INDEXE中ORPHANED_ENTRIES新列显示索引还没被维护。-- 检查是否需要索引维护SELECT index_name, orphaned_entriesFROM user_indexesORDER BY 1; INDEX_NAME ORP-------------------- ---T1_IDX YEST1_PK YES SQL>如果我们手工触发索引维护,我们将会看到ORPHANED_ENTRIES列的变化-- 手工触发索引维护EXECDBMS_PART.cleanup_gidx(USER, "t1"); -- 查看是否需要索引维护SELECT index_name, orphaned_entriesFROM user_indexesORDER BY 1; INDEX_NAME ORP-----------------------T1_IDX NOT1_PK NOSQL>更多Oracle相关信息见Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12本文永久更新链接地址