当前位置: 首页 > news >正文

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


相关文章:

  • javaWeb_使用标签库简化jsp
  • 地图后台判断一点是否在一个区域内
  • 思科路由器DHCP配置(GNS3模拟)
  • 冲刺(8)
  • POJ - 1062 昂贵的聘礼(最短路Dijkstra)
  • openssl生成https证书 (转)
  • vue单文件里name属性是做什么的?
  • JS题目及答案整理
  • docker 构建dockerfile
  • 重构摘要11_处理概括关系
  • 自定义reg52.h头文件(单片机学习重难点核心知识点)
  • leetcode46 Permutation 排列组合
  • Cocos2D-X2.2.3学习笔记8(处理精灵单击、双击和三连击事件)
  • 无法抗拒Minecraft给予超高的自由度和探索-微访谈
  • 移动端播放视频文件
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • avalon2.2的VM生成过程
  • Druid 在有赞的实践
  • JavaScript异步流程控制的前世今生
  • Laravel 菜鸟晋级之路
  • PHP CLI应用的调试原理
  • Service Worker
  • 半理解系列--Promise的进化史
  • 复杂数据处理
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 记一次删除Git记录中的大文件的过程
  • 通过git安装npm私有模块
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 小程序button引导用户授权
  • ​TypeScript都不会用,也敢说会前端?
  • ​你们这样子,耽误我的工作进度怎么办?
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • ​油烟净化器电源安全,保障健康餐饮生活
  • $.ajax()参数及用法
  • (02)vite环境变量配置
  • (13):Silverlight 2 数据与通信之WebRequest
  • (备忘)Java Map 遍历
  • (差分)胡桃爱原石
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (论文阅读40-45)图像描述1
  • (转)iOS字体
  • (转)VC++中ondraw在什么时候调用的
  • (转载)VS2010/MFC编程入门之三十四(菜单:VS2010菜单资源详解)
  • .net core控制台应用程序初识
  • /etc/sudoer文件配置简析
  • @manytomany 保存后数据被删除_[Windows] 数据恢复软件RStudio v8.14.179675 便携特别版...
  • [BZOJ3223]文艺平衡树
  • [error] 17755#0: *58522 readv() failed (104: Connection reset by peer) while reading upstream
  • [LeetCode] 178. 分数排名
  • [leetcode]_String to Integer (atoi)
  • [LeetCode]—Rotate Image 矩阵90度翻转
  • [node] Node.js的全局对象Global
  • [office] excel中weekday函数的使用方法 #学习方法#微信#媒体