引言
oracle19c分区表,如存在全局索引的情况下,在drop部分分区的情况下,如果不加update global indexes选项,全局索引会失效;必须加updata global indexes选项,在该选项下,全局索引不会失效,也不会当场更新,只是进行标记,然后跟随系统任务sys.PMO_DEFERRED_GIDX_MAINT_JOB进行更新索引,该任务默认是在每天的太平洋时间凌晨2:00执行,和系统统计信息任务类似。
该任务相关SQL如下:
1.删除分区语句
alter table MESHIS.RET_PRD_MTDT DROP partition SYS_P33602 UPDATE GLOBAL INDEXES;
alter table MESHIS.RET_PROJECT_INS_ITEM DROP PARTITION SYS_P31582 UPDATE GLOBAL INDEXES;
2.查看索引状态
--ORPHANED_ENTRIES(游离状态)字段为YES表示这个全局索引需要维护,默认在凌晨两点钟,会执行JOB对ORPHANED_ENTRIES为YES的全局索引进行统一的维护。可以从DBA_SCHEDULER_JOBS里查看到这个JOB的信息。
select TABLE_NAME,INDEX_NAME,STATUS,NUM_ROWS,ORPHANED_ENTRIES from dba_indexes where TABLE_NAME='T_TEST';
select TABLE_NAME,INDEX_NAME,STATUS,NUM_ROWS,ORPHANED_ENTRIES from dba_indexes where ORPHANED_ENTRIES='YES';
3.查看异步维护索引任务
select JOB_NAME,PROGRAM_NAME,LAST_START_DATE,NEXT_RUN_DATE from DBA_SCHEDULER_JOBS where JOB_NAME='PMO_DEFERRED_GIDX_MAINT_JOB';
select a.owner,a.job_name,a.REPEAT_INTERVAL,a.last_start_date,a.LAST_RUN_DURATION,a.next_run_date from dba_scheduler_jobs a where a.job_name='PMO_DEFERRED_GIDX_MAINT_JOB' ;
4.手动维护索引
假如业务是24H的,建议是进行挑选时间进行手动维护索引。
因为索引维护任务会产生大量redo日志,严重影响业务。
可以先设置index nologging减少日志量
ALTER INDEX MESHIS.RET_PROJECT_INS_ITEM_UNQ01 NOLOGGING ;
ALTER INDEX MESHIS.RET_PROJECT_INS_ITEM_UNQ01 LOGGING noparallel;
4.1方法1调用系统procedure
exec DBMS_PART.CLEANUP_GIDX('MESHIS','RET_PRD_MTDT');
4.2方法2调用系统任务立即执行
exec dbms_scheduler.run_job('PMO_DEFERRED_GIDX_MAINT_JOB');
4.3对索引进行清理
alter index MESHIS.SYS_C0037752 COALESCE CLEANUP parallel 8;
4.4重建索引
建议关闭undo自动拓展进行rebuild,不然tablespace会自动拓展很大。
alter index MESHIS.SYS_C0037752 rebuild online parallel 16 nologging;
alter index MESHIS.RET_PROJECT_INS_ITEM_UNQ01 rebuild parallel 16 nologging;
5.最后查看查看状态
select OWNER,TABLE_NAME,INDEX_NAME,STATUS,NUM_ROWS,ORPHANED_ENTRIES from dba_indexes
where TABLE_NAME='RET_PROJECT_INS_ITEM'
AND OWNER='MESHIS';
select bytes/1024/1024/1024 from dba_segments where segment_name ='RET_PROJECT_INS_ITEM_UNQ01';
SELECT degree FROM DBA_INDEXES WHERE INDEX_NAME ='SYS_C0037752';
小结:方法1-3不会降低index的高水位,方法4可以降低。
实际:
1.删除一个分区:进行方法3时,生成redo log量和整个索引大小差不多,时间
2.删除20个分区:进行方法4时,生成redo log量较整个索引大小稍多一点
6.手动搜集索引统计信息
exec dbms_stats.gather_index_stats('MESHIS','RET_PROJECT_INS_ITEM_UNQ01');
--这个调度会规定时间发起,对异步索引进行自动在线重建。
--先不说太平洋时间,也不说这个调度的好处(好处那太明显了),说说有什么问题:
--1、会产生大量归档日志
--2、全局索引维护,会引发gc问题
--3、引起其它锁问题
--不过,2、3都不太严重,1对io的压力比较明显,还可能导致归档目录预警,因此,这个调度,一定要放在夜间非繁忙时段进行(跳过后台跑批时间)。