阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

Oracle 12c中性能优化&功能增强新特性之全局索引DROP和TRUNCATE 分区的异步维护

116次阅读
没有评论

共计 2316 个字符,预计需要花费 6 分钟才能阅读完成。

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 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>

更多 Oracle 相关信息见 Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12

本文永久更新链接地址 :http://www.linuxidc.com/Linux/2017-01/140022.htm

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-22发表,共计2316字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中