oracle12c新特性之异步全局索引维护
来源:这里教程网
时间:2026-03-03 11:46:26
作者:
这是oracle12c的新特性。之前drop分区或者truncate分区的时候,会使得全局索引不可用,update indexes和update global indexes虽然可以维护索引的可用性,但是索引的维护是当时立刻发生的,业务高峰时刻会争夺性能。全局索引的异步维护就可以解决这个矛盾点。配合update索引的语句,表中的数据会当时就删除,但是需要被清理的索引条目是不会释放的,这样可以实现既保证全局索引可用性,又···延后对索引的维护,错开高峰时间,避免了高峰时间性能争用问题。并且后续维护也是oracle自动进行的,不需要dba手动干预,当然手动干预也是可行的。
针对此新特性,oracle的改动有下面几个方面:
1.特定增加了自动维护全局索引的job,即SYS.PMO_DEFERRED_GIDX_MAINT_JOB,默认是每天的凌晨两点钟钟维护所有的全局索引。
2.同时在dba_indexes和dba_ind_partitions视图增加了ORPHANED_ENTRIES这一列。没有清理索引条目的全局索引会被标记为孤儿状态。
3.对孤儿条目的清理,有三种方法:
a.dbms_part.cleanup_gidx包
b.alter index INDEX_NAME rebuild;
c.alter index INDEX_NAME coalesce cleanup;
建立测试表:
[oracle@cdbtest1 admin]$ sqlplus ming/oracle@192.168.61.2/ming
MING@192.168.61.2/ming(MING)> sho con_name user
CON_NAME
------------------------------
MING
USER is "MING"
create table t_part
(
a number,
b number,
c varchar2(20)
)
partition by range(a)
(
partition p1 values less than(100),
partition p2 values less than(200),
partition p3 values less than(300),
partition p4 values less than(400),
partition p_max values less than(maxvalue)
);
插入数据:
declare
i number;
begin
for i in 1..500 loop
insert into t_part values(i,i,dbms_random.string('l',8));
end loop;
commit;
end;
/
创建索引:
create index t_part_idx_01 on t_part(b) global;
create index t_part_idx_02 on t_part(c) local;
create index t_part_idx_03
on t_part(a,b)
global
partition by range(a)
(
partition part_1 values less than (200),
partition part_2 values less than (maxvalue)
);
收集统计信息:
exec dbms_stats.gather_table_stats(ownname => 'MING',tabname => 'T_PART',estimate_percent => 100,cascade=>TRUE);
现在的索引的状态:
SYS@cdbtest1(CDB$ROOT)> SET LINE 200
SYS@cdbtest1(CDB$ROOT)> COL INDEX_NAME FOR A30
SYS@cdbtest1(CDB$ROOT)> select index_name,STATUS,ORPHANED_ENTRIES,PARTITIONED from dba_indexes where table_name='T_PART' and index_name='T_PART_IDX_01';
INDEX_NAME STATUS ORP PAR
------------------------------ -------- --- ---
T_PART_IDX_01 VALID NO NO
SYS@cdbtest1(CDB$ROOT)> col index_name for a30
SYS@cdbtest1(CDB$ROOT)> col partition_name for a30
SYS@cdbtest1(CDB$ROOT)> set line 200
SYS@cdbtest1(CDB$ROOT)> select index_name,PARTITION_NAME,status,ORPHANED_ENTRIES from dba_ind_partitions where INDEX_name in ('T_PART_IDX_02','T_PART_IDX_03');
INDEX_NAME PARTITION_NAME STATUS ORP
------------------------------ ------------------------------ -------- ---
T_PART_IDX_02 P1 USABLE NO
T_PART_IDX_02 P2 USABLE NO
T_PART_IDX_02 P3 USABLE NO
T_PART_IDX_02 P4 USABLE NO
T_PART_IDX_02 P_MAX USABLE NO
T_PART_IDX_03 PART_1 USABLE NO
T_PART_IDX_03 PART_2 USABLE NO
7 rows selected.
注意此时的ORPHANED_ENTRIES列为NO。
全局索引异步维护特性默认开启,update indexes和update global indexes因为向后兼容性的缘故还可以用。
truncate分区:
alter table t_part truncate partition p1 update indexes;
truncate分区之后索引的状态:
INDEX_NAME STATUS ORP PAR
------------------------------ -------- --- ---
T_PART_IDX_01 VALID YES NO
INDEX_NAME PARTITION_NAME STATUS ORP
------------------------------ ------------------------------ -------- ---
T_PART_IDX_02 P1 USABLE NO
T_PART_IDX_02 P2 USABLE NO
T_PART_IDX_02 P3 USABLE NO
T_PART_IDX_02 P4 USABLE NO
T_PART_IDX_02 P_MAX USABLE NO
T_PART_IDX_03 PART_1 USABLE YES
T_PART_IDX_03 PART_2 USABLE YES
可以看到,索引状态可用,此时全局索引的ORPHANED_ENTRIES列值由NO变为了YES。
清理孤儿条目:
下面是今天自动清理孤儿条目的job信息:
SYS@cdbtest1(CDB$ROOT)> set line 300
SYS@cdbtest1(CDB$ROOT)> col START_DATE for a35
SYS@cdbtest1(CDB$ROOT)> select job_name,SCHEDULE_NAME,START_DATE,ENABLED from dba_SCHEDULER_JOBS where JOB_NAME='PMO_DEFERRED_GIDX_MAINT_JOB';
JOB_NAME SCHEDULE_NAME START_DATE ENABL
---------------------------------------- ------------------------------ ----------------------------------- -----
PMO_DEFERRED_GIDX_MAINT_JOB PMO_DEFERRED_GIDX_MAINT_SCHED 08-FEB-18 02.00.00.071445 AM PRC TRUE
手动清理孤儿条目:
exec DBMS_PART.CLEANUP_GIDX('MING','T_PART'); --注意要在pdb里面执行。
清理之后,索引状态:
INDEX_NAME STATUS ORP PAR
------------------------------ -------- --- ---
T_PART_IDX_01 VALID NO NO
INDEX_NAME PARTITION_NAME STATUS ORP
------------------------------ ------------------------------ -------- ---
T_PART_IDX_02 P1 USABLE NO
T_PART_IDX_02 P2 USABLE NO
T_PART_IDX_02 P3 USABLE NO
T_PART_IDX_02 P4 USABLE NO
T_PART_IDX_02 P_MAX USABLE NO
T_PART_IDX_03 PART_1 USABLE NO
T_PART_IDX_03 PART_2 USABLE NO
此时全局索引的ORPHANED_ENTRIES列值由YES变为了NO。
drop分区和其他两种方法,可以自己去试一下,效果是一样的。
还是推荐用dbms包去删除全局索引中孤儿条目。原因在于全局分区索引无法用第三种coalesce cleanup的方法。查看官方文档中的语法,也没有找到全局分区索引的写法:
MING@192.168.61.2/ming(MING)> alter index T_PART_IDX_03 coalesce cleanup;
alter index T_PART_IDX_03 coalesce cleanup
*
ERROR at line 1:
ORA-08111: a partitioned index may not be coalesced as a whole
MING@192.168.61.2/ming(MING)> alter index T_PART_IDX_03 coalesce PARTITION part_2 cleanup;
alter index T_PART_IDX_03 coalesce PARTITION part_2 cleanup
*
ERROR at line 1:
ORA-14174: only a <parallel clause> may follow COALESCE PARTITION|SUBPARTITION
编辑推荐:
- rman开启备份优化对备份归档的影响03-03
- oracle12c新特性之异步全局索引维护03-03
- word2010怎么设置默认作者?实时预览怎么启用?03-03
- AIX系统日志03-03
- linux start_udev 导致VIP漂移03-03
- word2010设置奇偶页不同页眉的两种方法03-03
- Oracle限制某个用户的连接数及PROFILE介绍03-03
- ORACLE 12C 之集群日志位置变化03-03
下一篇:
相关推荐
-
雷神推出 MIX PRO II 迷你主机:基于 Ultra 200H,玻璃上盖 + ARGB 灯效
2 月 9 日消息,雷神 (THUNDEROBOT) 现已宣布推出基于英
-
制造商 Musnap 推出彩色墨水屏电纸书 Ocean C:支持手写笔、第三方安卓应用
2 月 10 日消息,制造商 Musnap 现已在海外推出一款 Oce
热文推荐
- 如何做一份完善的补丁分析
如何做一份完善的补丁分析
26-03-03 - Maya建模教程:人头建模的详细教程
Maya建模教程:人头建模的详细教程
26-03-03 - 动态抽样(Dynamic Sampling)
动态抽样(Dynamic Sampling)
26-03-03 - rman异机恢复中遇到ora-01157(转储文件无法识别问题)
rman异机恢复中遇到ora-01157(转储文件无法识别问题)
26-03-03 - 模拟enq: TX – allocate ITL entry以及数据块dump文件分析
- ORA-32004: obsolete and/or deprecated parameter(s) specified
- Oracle RAC 全局等待事件 gc current block busy 和 gc cr multi block request 说明
- Maya建模教程:打造超级英雄钢铁侠
Maya建模教程:打造超级英雄钢铁侠
26-03-03 - 2010word如何设置背景图片
2010word如何设置背景图片
26-03-03 - word2010解决停止响应的教程
word2010解决停止响应的教程
26-03-03
