ORACLE 12C(以后个版本)新增了异步全局索引维护功能,该功能的主要作用是将分区表的truncat操作与全局索引立即失效分离,
用户truncate分区后,全局索引不会立即失效,而是将全局索引设置为游离状态(orphaned_entries),这时候,全局索引仍然可以使用,不影响用户业务。
这个功能太好了,尽管我们不赞成在分区表上建全局索引,但总是不可避免
orphaned_entries 变更为YES,表示这个索引需要异步维护了,如果 orphaned_entries=yes,走同样的全局索引会比平常要慢很多
-- Slow Index Scans on Global Indexes Due to Orphaned Index Keys (Doc ID 3020152.1)
set linesize 1000
col job_name for a30
select job_name,last_start_date,next_run_date from dba_scheduler_jobs where JOB_NAME='PMO_DEFERRED_GIDX_MAINT_JOB';
JOB_NAME LAST_START_DATE NEXT_RUN_DATE
------------------------------ --------------------------------------------------------------------------- ---------------------------------------------------------------------------
PMO_DEFERRED_GIDX_MAINT_JOB 21-AUG-24 02.15.05.557756 AM PST8PDT 22-AUG-24 02.00.00.665967 AM PST8PDT
--注意PST(太平洋时间) 和北京时间差16小时,比如如上每天凌晨2点运行,对应北京时间是每天18点运行
--调整异步全局索引维护时间
exec DBMS_SCHEDULER.SET_ATTRIBUTE('SYS.PMO_DEFERRED_GIDX_MAINT_SCHED','repeat_interval','FREQ=DAILY; BYHOUR=23; BYMINUTE=38; BYSECOND=0');
--维护索引不会搜集统计信息,以下两种写法效果一样,早期可能不一样
--索引没更新,但是索引还有效,也正是有这个特性导致删除本分区不会阻塞其他分区
UPDATE GLOBAL INDEXES 只维护全局索引(这个说法错误,测试发现用这个命令子分区索引也不会失效)
UPDATE INDEXES 同时维护全局和本地索引
--索引组织表操作分区在线维护索引只能用 UPDATE GLOBAL INDEXES
drop table t1;
create table t1 partition by range(created)
(partition p1 values less than (to_date('2022-1-1','yyyy-mm-dd')),
partition p2 values less than (to_date('2023-1-1','yyyy-mm-dd')),
partition p3 values less than (to_date('2024-1-1','yyyy-mm-dd')),
partition p4 values less than (to_date('2025-1-1','yyyy-mm-dd')),
partition p5 values less than (maxvalue))
as select * from dba_objects;
create index idx1_t1 on t1(created) global;
create index idx2_t1 on t1(created,1) local;
select count(1) from t1 partition(p1);
ALTER TABLE t1 truncate PARTITION p1 UPDATE GLOBAL INDEXES;
select status,NUM_ROWS,ORPHANED_ENTRIES from dba_indexes where index_name='IDX1_T1';
STATUS NUM_ROWS ORPHAN
---------------- ---------- ------
VALID 72605 YES
set linesize 1000
col partition_name for a20
select partition_name,NUM_ROWS,status ,ORPHANED_ENTRIES from dba_ind_partitions where index_name='IDX2_T1';
PARTITION_NAME STATUS ORPHAN
-------------------- ---------------- ------
P1 USABLE NO
P2 USABLE NO
P3 USABLE NO
P5 USABLE NO
--手工调用异步全局索引维护:
exec DBMS_PART.CLEANUP_GIDX('SCOTT','T1');
或者
exec dbms_scheduler.run_job('PMO_DEFERRED_GIDX_MAINT_JOB');
--关闭异步索引维护:
Disable asynchronous global index maintenance by setting "_fast_index_maintenance" = FALSE. (It is set to TRUE by default.)
In this case, the DDL with UPDATE GLOBAL INDEXES will take a longer time.
alter system set "_fast_index_maintenance"=false;
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




