共计 2316 个字符,预计需要花费 6 分钟才能阅读完成。
Oracle 12c 中,通过延迟相关索引的维护可以优化某些 DROP 和 TRUNCATE 分区命令的性能,同时,保持全局索引为有效。
1. 设置
下面的例子演示带全局索引的表创建和加载数据的过程。
— 建表
CREATE TABLE t1
(id NUMBER,
comment VARCHAR2(50),
crt_time DATE)
PARTITION BY RANGE (crt_time)
(PARTITION part_14 VALUES LESS THAN (TO_DATE(’01/01/2015′, ‘DD/MM/YYYY’))TABLESPACE users,
PARTITION part_15 VALUES LESS THAN(TO_DATE(’01/01/2016′, ‘DD/MM/YYYY’)) TABLESPACE users);
ALTER TABLE t1 ADD CONSTRAINT t1_pk PRIMARY KEY (id);
CREATE INDEX t1_idx ON t1 (crt_time);
– 加载数据
INSERT INTO t1
SELECT level,
‘commit for ‘ || level,
CASE
WHEN MOD(level,2) = 0 THENTO_DATE(’01/07/2014′, ‘DD/MM/YYYY’)
ELSE TO_DATE(’01/07/2015′,’DD/MM/YYYY’)
END
FROM dual
CONNECT BY level <= 10000;
COMMIT;
EXEC DBMS_STATS.gather_table_stats(USER, ‘t1’);
— 检查索引
COLUMN table_name FORMAT A20
COLUMN index_name FORMAT A20
SElECT table_name,
index_name,
status
FROM user_indexes
ORDER BY 1,2;
TABLE_NAME INDEX_NAME STATUS
——————– ——————– ——–
T1 T1_IDX VALID
T1 T1_PK VALID
SQL>
2. 全局索引异步维护
现在,DROP 和 TRUNCATE PARTITION 命令和 UPDATE_INDEXES 一起使用时,只会导致相关元数据的变化。该功能目前只能用于堆表,不支持对象表,域索引或 SYS 用户的对象。
实际的索引维护稍后被执行,当满足如下之一的条件时。
SYS.PMO_DEFERRED_GIDX_MAINT_JOB 作业每天 2 点被调度时。
通过 DBMS_SCHEDULER.RUN_JOB 手工运行 SYS.PMO_DEFERRED_GIDX_MAINT_JOB 时。
运行 DBMS_PART.CLEANUP_GIDX 过程时。
运行 ALTER INDEX REBUILD [PARTITION] 命令时。
运行 ALTER INDEX [PARTITION] COALESCE CLEANUP 命令时。
Oracle12c 前,如果我们 DROP 或 TRUNCATE 了一个分区,将会导致全局索引失效,UPDATE_INDEXES 子句会导致操作期间索引重建,使得整个操作变慢。下例中,我们 TRUNCATE 一个分区,然后查看索引状态。
— Truncate 一个分区
ALTER TABLE t1 TRUNCATE PARTITIONpart_2014 DROP STORAGE UPDATE INDEXES;
或
ALTER TABLE t1 DROP PARTITION part_2014UPDATE INDEXES;
— 查看索引状态
SElECT table_name,
index_name,
status
FROM user_indexes
ORDER BY 1,2;
TABLE_NAME INDEX_NAME STATUS
——————– —————————-
T1 T1_IDX VALID
T1 T1_PK VALID
SQL>
视图 USER_INDEXE 中 ORPHANED_ENTRIES 新列显示索引还没被维护。
— 检查是否需要索引维护
SELECT index_name,
orphaned_entries
FROM user_indexes
ORDER BY 1;
INDEX_NAME ORP
——————– —
T1_IDX YES
T1_PK YES
SQL> 如果我们手工触发索引维护,我们将会看到 ORPHANED_ENTRIES 列的变化
— 手工触发索引维护
EXECDBMS_PART.cleanup_gidx(USER, ‘t1’);
— 查看是否需要索引维护
SELECT index_name,
orphaned_entries
FROM user_indexes
ORDER BY 1;
INDEX_NAME ORP
———————–
T1_IDX NO
T1_PK NO
SQL>
更多 Oracle 相关信息见 Oracle 专题页面 http://www.linuxidc.com/topicnews.aspx?tid=12
本文永久更新链接地址 :http://www.linuxidc.com/Linux/2017-01/140022.htm