12C新特性之对表分区维护的增强验证:
1、在Oracle 12c R1之前,一次只可能添加一个新分区到一个已存在的分区表。要添加一个以上的新分区,需要对每个新分区都单独执行一次ALTER TABLE ADD PARTITION语句。而Oracle 12c只需要使用一条单独的ALTERTABLE ADD PARTITION 命令就可以添加多个新分区,这增加了数据库灵活性。以下示例说明了如何添加多个新分区到已存在的分区表:
SQL> CREATE TABLE emp_part (enonumber(8), ename varchar2(40), sal number (6)) PARTITION BY RANGE (sal)(PARTITION p1 VALUES LESS THAN (10000), PARTITION p2 VALUES LESS THAN (20000),PARTITION p3 VALUES LESS THAN (30000) );
Table created.
SQL> ALTER TABLE emp_part ADD PARTITIONp4 VALUES LESS THAN (35000), PARTITION p5 VALUES LESS THAN (40000);
Table altered.
同样,只要MAXVALUE分区不存在,你就可以添加多个新分区到一个列表和系统分区表。
2、删除和截断多个分区/子分区
作为数据维护的一部分,DBA通常会在一个分区表上进行删除或截断分区的维护任务。在12c R1之前,对于一个已存在的分区表一次只可能删除或截断一个分区。而对于Oracle 12c,可以用单条ALTER TABLE table_name {DROP|TRUNCATE} PARTITIONS 命令来撤销或合并多个分区和子分区。
SQL> ALTER TABLE emp_part truncatePARTITIONS p4,p5;
Table truncated.
SQL> ALTER TABLE emp_part DROPPARTITIONS p4,p5;
Table altered.
要保持索引更新,使用UPDATE INDEXES或UPDATE GLOBAL INDEXES语句,如果你在不使用UPDATE GLOBAL INDEXES 语句的情况下删除或截断一个分区,你可以在USER_INDEXES或USER_IND_PARTITIONS 字典视图下查询ORPHANED_ENTRIES字段以找出是否有索引包含任何的过期条目。如下所示:
SQL> ALTER TABLE emp_part TRUNCATEPARTITIONS p4,p5 UPDATE GLOBAL INDEXES;
Table truncated.
SQL> ALTER TABLE emp_part DROP PARTITIONS p4,p5 UPDATE GLOBAL INDEXES;
Table altered.
3、将单个分区分割为多个新分区
在12c中新增强的SPLIT PARTITION 语句可以让你只使用一个单独命令将一个特定分区或子分区分割为多个新分区。下例说明了如何将一个分区分割为多个新分区或者多个分区合并为一个分区:
SQL> ALTER TABLE emp_part ADD PARTITION p6VALUES LESS THAN (maxvalue);
Table altered.
SQL> ALTER TABLE emp_part SPLITPARTITION p6 INTO (PARTITION p61 VALUES LESS THAN (50000), PARTITION p62 VALUESLESS THAN (60000), PARTITION p6);
Table altered.
SQL> ALTER TABLE emp_part MERGEPARTITIONS p4,p5 INTO PARTITION p_merge;
Table altered.
在分区表上的维护操作可以留下指向不存在数据段的全局索引。Oracle 12c引入了新的称为DBMS_PART.CLEANUP_GIDX的过程。这个过程清理全局索引,并导致性能和存储管理上的提升。维护JOB通过SMON以异步模式运行,清理所有全局索引;
SYS.PMO_DEFERRED_GIDX_MAINT_JOB job负责清理所有全局索引。该job默认被安排在每天上午2:00执行。如果你想主动地清理索引,可以任何时候使用DBMS_SCHEDULER.RUN_JOB运行
SYS.PMO_DEFERRED_GIDX_MAINT_JOB job。也可以基于特定的需求修改SYS.PMO_DEFERRED_GIDX_MAINT_JOB job的运行时间表。然而,Oracle推荐不要删除该job。
补充知识:
分区索引字典:
DBA_PART_INDEXES 分区索引的概要统计信息,可以得知每个表上有哪些分区索引,分区索引的类新(local/global,)
Dba_ind_partitions每个分区索引的分区级统计信息
Dba_indexesminusdba_part_indexes,可以得到每个表上有哪些非分区索引
索引重建:
Alter index idx_name rebuild partitionindex_partition_name [online nologging]
需要对每个分区索引做rebuild,重建的时候可以选择online(不会锁定表),或者nologging建立索引的时候不生成日志,加快速度。
Alter index rebuild idx_name [onlinenologging]
对非分区索引,只能整个index重建