Oracle 12C 新特性之表分区带 异步全局索引异步维护(一次add、truncate、drop、spilt、merge多个分区)

简介:

实验准备:
-- 创建实验表
CREATE TABLE p_andy
(ID number(10), NAME varchar2(40))
PARTITION BY RANGE (id)
(PARTITION p1 VALUES LESS THAN (10),
PARTITION p2 VALUES LESS THAN (20)
);
Table created.
-- 查看现在表的分区:
SQL> 
col table_name for a25
col partition_name for a25
select table_name,partition_name,PARTITION_POSITION,tablespace_name,HIGH_VALUE from user_tab_partitions where table_name='P_ANDY';

TABLE_NAME                PARTITION_NAME            PARTITION_POSITION TABLESPACE_NAME                HIGH_VALUE
------------------------- ------------------------- ------------------ ------------------------------ --------------
P_ANDY                    P1                                         1 USERS                          10
P_ANDY                    P2                                         2 USERS                          20
一、  一次add多个分区

SQL> 

ALTER TABLE P_ANDY ADD   
PARTITION p3 VALUES  LESS THAN (30),
PARTITION p4 VALUES LESS THAN (40);
Table altered.
-- 查看add后的分区情况
SQL> 
select table_name,partition_name,PARTITION_POSITION,tablespace_name,HIGH_VALUE from user_tab_partitions where table_name='P_ANDY';
TABLE_NAME                PARTITION_NAME            PARTITION_POSITION TABLESPACE_NAME                HIGH_VALUE
------------------------- ------------------------- ------------------ ------------------------------ -----------
P_ANDY                    P1                                         1 USERS                          10
P_ANDY                    P2                                         2 USERS                          20
P_ANDY                    P3                                         3 USERS                          30
P_ANDY                    P4                                         4 USERS                          40
-- 插入数据
SQL> 
begin
for i in 1 .. 39 loop
insert into p_andy values(i,'andyi');
end loop ;
commit;
end;
/
PL/SQL procedure successfully completed.

二、  一次 truncate 或者 drop 多个分区 

TRUNCATE 和 EXCHANGE 分区及子分区。无论是 TRUNCATE 还是 EXCHANGE 分区,在主表上执行,都可以级联的作用在子表、孙子表、重孙子表、重重重...孙子表上同时运行。对于 TRUNCATE 而言,所有表的 TRUNCATE 操作在同一个事务中,如果中途失败,会回滚到命令执行之前的状头。这两个功能通过关键字 CASCADE实现。

(说明这里只演示truncate,drop使用只需要关键字替换就可以了)
方式一:truncate 不带 update index ,如果表有全局索引,则truncate partition会失全局索引失效。
-- 创建一个全局非分区索引
SQL> create index idx_pandy_id on p_andy(id);
Index created.
--查看索引名字
SQL> 
col column_name for a40
SELECT index_name, column_name, descend  FROM user_ind_columns  WHERE table_name = 'P_ANDY';
INDEX_NAME                COLUMN_NAME                              DESC
------------------------- ---------------------------------------- ----
IDX_PANDY_ID              ID                                       ASC
-- 查看索引状态
SQL> 
col index_name for a25
select table_name,index_name,status,blevel,leaf_blocks from user_Indexes where index_name ='IDX_PANDY_ID';
TABLE_NAME                INDEX_NAME                STATUS       BLEVEL LEAF_BLOCKS
------------------------- ------------------------- -------- ---------- -----------
P_ANDY                    IDX_PANDY_ID              VALID             0           1
-- truncate多个分区 , without update index
SQL> ALTER TABLE p_andy TRUNCATE partition p3,p4;
Table truncated.
-- 查看索引状态
SQL> select table_name,index_name,status,blevel,leaf_blocks from user_Indexes where index_name ='IDX_PANDY_ID';
TABLE_NAME                INDEX_NAME                STATUS       BLEVEL LEAF_BLOCKS
------------------------- ------------------------- -------- ---------- -----------
P_ANDY                    IDX_PANDY_ID              UNUSABLE          0           1
方式二:truncate 带 update index ,如果表有全局索引,则truncate partition不会使全局索引失效。
-- 插入数据
SQL>
begin
for i in 20 .. 39 loop
insert into p_andy values(i,'andyi');
end loop ;
commit;
end;
/
PL/SQL procedure successfully completed.
-- 查看索引状态
SQL> select table_name,index_name,status,blevel,leaf_blocks from user_Indexes where index_name ='IDX_PANDY_ID';
TABLE_NAME                INDEX_NAME                STATUS       BLEVEL LEAF_BLOCKS
------------------------- ------------------------- -------- ---------- -----------
P_ANDY                    IDX_PANDY_ID              UNUSABLE          0           1
-- 重建索引
SQL> alter index IDX_PANDY_ID rebuild;
Index altered.
-- 查看索引状态
SQL> select table_name,index_name,status,blevel,leaf_blocks from user_Indexes where index_name ='IDX_PANDY_ID';
TABLE_NAME                INDEX_NAME                STATUS       BLEVEL LEAF_BLOCKS
------------------------- ------------------------- -------- ---------- -----------
P_ANDY                    IDX_PANDY_ID              VALID             0           1
-- truncate多个分区,带 update index
SQL> ALTER TABLE p_andy TRUNCATE partition p3,p4 UPDATE GLOBAL INDEXES;
Table truncated.
说明:
1、Oracle 12c 可以实现了异步全局索引异步维护的功能,在分区维护操作,比如 DROP 或 TRUNCATE 后,仍然是 VALID 状态,索引
不会失效,不过索引的状态是包含 OBSOLETE 数据,当维护操作完成,索引状态恢复。
2、12c 中数据字典DBA/ALL/USER_INDEXES OR DBA/ALL/USER_IND_PARTITIONS增加了列ORPHANED_ENTRIES ,表示当前全局索引是否保含过期条目(索引有记录,而表中的实际数据已经drop或者truncate)。
3、列ORPHANED_ENTRIES三个值
该列可能存在3个值:
• YES: 该索引存在orphaned(过期游离)条目
• NO: 该索引不存在orphaned(过期游离)条目
• N/A: 不适用的类型如非分区表索引或local 索引
4、 对于索引存在orphaned , 我们可以手动清除(方法推荐两种)
法一:ALTER INDEX xxx  REBUILD;
法二:SQL> alter session force parallel ddl parallel 8; 手动维护时使用并行,加速维护 
exec DBMS_PART.CLEANUP_GIDX('[SCHEMA]','[TABLE NAME]');
-- 查看索引状态   ORPHANED_ENTRIES
SQL> select table_name,index_name,status,blevel,leaf_blocks,orphaned_entries from user_Indexes where index_name ='IDX_PANDY_ID';
TABLE_NAME                INDEX_NAME                STATUS       BLEVEL LEAF_BLOCKS ORP
------------------------- ------------------------- -------- ---------- ----------- ---
P_ANDY                    IDX_PANDY_ID              VALID             0           1 YES
三、  一次spilt多个分区
12c 中新增强的 SPLIT PARTITION 语句可以让你只使用一个单独命令将一个特定分区或子分区分割为多个新分区。
-- 插入数据
SQL>
begin
for i in 20 .. 39 loop
insert into p_andy values(i,'andyi');
end loop ;
commit;
end;
/
-- 查看分区情况
SQL> 
select table_name,partition_name,PARTITION_POSITION,tablespace_name,HIGH_VALUE from user_tab_partitions where table_name='P_ANDY';
TABLE_NAME                PARTITION_NAME            PARTITION_POSITION TABLESPACE_NAME                HIGH_VALUE
------------------------- ------------------------- ------------------ ------------------------------ -----------
P_ANDY                    P1                                         1 USERS                          10
P_ANDY                    P2                                         2 USERS                          20
P_ANDY                    P3                                         3 USERS                          30
P_ANDY                    P4                                         4 USERS                          40
SQL>  
ALTER TABLE P_ANDY  SPLIT PARTITION P4 INTO
(PARTITION p5 VALUES LESS THAN (33),
PARTITION p6 VALUES LESS THAN (36), PARTITION P4) UPDATE GLOBAL INDEXES ;
Table altered.
-- 查看split后分区情况
SQL> 
select table_name,partition_name,PARTITION_POSITION,tablespace_name,HIGH_VALUE from user_tab_partitions where table_name='P_ANDY';
TABLE_NAME                PARTITION_NAME            PARTITION_POSITION TABLESPACE_NAME                HIGH_VALUE
------------------------- ------------------------- ------------------ ------------------------------ -------------
P_ANDY                    P1                                         1 USERS                          10
P_ANDY                    P2                                         2 USERS                          20
P_ANDY                    P3                                         3 USERS                          30
P_ANDY                    P5                                         4 USERS                          33
P_ANDY                    P6                                         5 USERS                          36
P_ANDY                    P4                                         6 USERS                          40
四、 将多个分区合并为一个分区
-- 表分区情况
SQL> 
select table_name,partition_name,PARTITION_POSITION,tablespace_name,HIGH_VALUE from user_tab_partitions where table_name='P_ANDY';
TABLE_NAME                PARTITION_NAME            PARTITION_POSITION TABLESPACE_NAME                HIGH_VALUE
------------------------- ------------------------- ------------------ ------------------------------ -------------
P_ANDY                    P1                                         1 USERS                          10
P_ANDY                    P2                                         2 USERS                          20
P_ANDY                    P3                                         3 USERS                          30
P_ANDY                    P5                                         4 USERS                          33
P_ANDY                    P6                                         5 USERS                          36
P_ANDY                    P4                                         6 USERS                          40
-- 多个分区合并为一个分区
SQL> ALTER TABLE p_andy MERGE PARTITIONS p5,p6 INTO PARTITION p4 UPDATE GLOBAL INDEXES;
ORA-14012: resulting partition name conflicts with that of an existing partition
SQL> ALTER TABLE p_andy MERGE PARTITIONS p5,p6,p4 INTO PARTITION p_merge UPDATE GLOBAL INDEXES;
Table altered.
-- 查看merge 合并分区后,分区情况
SQL> select table_name,partition_name,PARTITION_POSITION,tablespace_name,HIGH_VALUE from user_tab_partitions where table_name='P_ANDY';
TABLE_NAME                PARTITION_NAME            PARTITION_POSITION TABLESPACE_NAME                HIGH_VALUE
------------------------- ------------------------- ------------------ ------------------------------ -------------
P_ANDY                    P1                                         1 USERS                          10
P_ANDY                    P2                                         2 USERS                          20
P_ANDY                    P3                                         3 USERS                          30
P_ANDY                    P_MERGE                                    4 USERS                          40


本文转自 张冲andy 博客园博客,原文链接:http://www.cnblogs.com/andy6/p/6849245.html   ,如需转载请自行联系原作者


相关文章
|
6月前
|
Oracle 关系型数据库 数据库
Oracle中merge Into的用法
Oracle中merge Into的用法
|
17天前
|
SQL Oracle 关系型数据库
[Oracle]索引
本文介绍了数据库索引的基本概念、优化查询的原理及分类。索引是一种数据结构(如B树或B+树),通过排序后的`rowid`来优化查询性能。文章详细解释了索引的构建过程、B+树的特点及其优势,并介绍了五种常见的索引类型:唯一索引、组合索引、反向键索引、位图索引和基于函数的索引。每种索引都有其适用场景和限制,帮助读者更好地理解和应用索引技术。
32 1
[Oracle]索引
|
4月前
|
SQL 机器学习/深度学习 Oracle
关系型数据库Oracle关键特性
【7月更文挑战第5天】
82 3
|
2月前
|
存储 Oracle 关系型数据库
Oracle和MySQL有哪些区别?从基本特性、技术选型、字段类型、事务、语句等角度详细对比Oracle和MySQL
从基本特性、技术选型、字段类型、事务提交方式、SQL语句、分页方法等方面对比Oracle和MySQL的区别。
517 18
Oracle和MySQL有哪些区别?从基本特性、技术选型、字段类型、事务、语句等角度详细对比Oracle和MySQL
|
4月前
|
存储 Oracle 关系型数据库
Oracle 12c支持哪些数据类型?
【7月更文挑战第20天】Oracle 12c支持哪些数据类型?
87 2
|
4月前
|
SQL Oracle 关系型数据库
Oracle 12c有哪些新特性?
【7月更文挑战第20天】Oracle 12c有哪些新特性?
67 2
|
4月前
|
存储 Oracle 关系型数据库
Oracle数据库ACID特性
【7月更文挑战第6天】
97 6
|
6月前
|
存储 Oracle 关系型数据库
Oracle索引知识看这一篇就足够
Oracle索引知识看这一篇就足够
|
6月前
|
监控 Oracle 关系型数据库
Oracle 12c的Adaptive执行计划:数据的“聪明导航员”
【4月更文挑战第19天】Oracle 12c的Adaptive执行计划是数据库查询的智能优化工具,能根据实际运行情况动态调整执行策略。它像一个聪明的导航系统,不仅生成初始执行计划,还能实时监控并适应统计信息和资源变化,例如自动切换索引或调整并行度。此外,它支持自适应连接和统计信息收集,提升处理复杂查询和变化数据环境的能力。数据管理员应充分利用这一特性来优化查询性能和用户体验。
|
6月前
|
存储 NoSQL Oracle
Oracle 12c的内存列存储:数据的“闪电侠”
【4月更文挑战第19天】Oracle 12c的内存列存储以超高速度革新数据处理,结合列存储与内存技术,实现快速查询与压缩。它支持向量化查询和并行处理,提升效率,但需合理配置以平衡系统资源。作为数据管理员,应善用此功能,适应业务需求和技术发展。