Oracle19c分区表全局索引维护指南

引言

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的压力比较明显,还可能导致归档目录预警,因此,这个调度,一定要放在夜间非繁忙时段进行(跳过后台跑批时间)。

相关推荐
新缸中之脑1 小时前
在Reddit上探索未满足的需求
数据库·oracle
light blue bird4 小时前
产线多并发客户端指令操作场景组件
jvm·oracle·.net·winform
坐吃山猪8 小时前
Neo4j04_数据库事务
数据库·oracle·neo4j
坐吃山猪8 小时前
Neo4j01_图数据库概念和服务器安装
服务器·数据库·oracle
汇智信科10 小时前
汇智信科网络考试系统:以技术赋能,重构在线测评新范式
linux·数据库·mysql·oracle·sqlserver·java技术
Apple_羊先森21 小时前
ORACLE数据库巡检SQL脚本--22、检查碎片程度最高的业务表
数据库·sql·oracle
_codemonster1 天前
PreparedStatement 和 Statement的区别
数据库·oracle
愈努力俞幸运1 天前
第5章数据库,实体关系图,ER图
数据库·oracle
Apple_羊先森1 天前
ORACLE数据库巡检SQL脚本--23、检查Oracle数据库中被锁定的数据库对象
数据库·sql·oracle
Apple_羊先森1 天前
ORACLE数据库巡检SQL脚本--21、正在执行的长耗时操作
数据库·sql·oracle