暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

oracle 12c 异步全局索引维护 模拟,调整与关闭

原创 四九年入国军 2024-08-22
335
   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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论