Oracle 知识篇+分区表上的索引由global改为local注意事项

★ 知识点

二、知识点
Local型索引有如下优点
1.Only one index partition must be rebuilt when a maintenance operation other than SPLIT PARTITION or ADD PARTITION is performed on an underlying table partition.
2.The duration of a partition maintenance operation remains proportional to partition size if the partitioned table has only local indexes.
3.Local indexes support partition independence.
4.Local indexes support smooth roll-out of old data and roll-in of new data in historical tables.
5.Oracle can take advantage of the fact that a local index is equipartitioned with the underlying table to generate better query access plans.
6.Local indexes simplify the task of tablespace incomplete recovery. To recover a partition or subpartition of a table to a point in time, you must also recover the corresponding index entries to the same point in time. The only way to accomplish this is with a local index. Then you can recover the corresponding table and index partitions or subpartitions.
对local型索引的分区表执行truncate/drop操作会级联维护相关分区上的索引并释放其空间
改造后对单独分区的truncate/drop等部分操作不会影响其他分区
改造后相关表上分区数据的维护/操作会更加方便快捷,如整理分区碎片/清空分区数据/删除分区数据
重建索引可以消除索引级的碎片

★ 注意事项

1.分区表中分区的drop/truncate操作会造成global型(非分区)索引变为不可用状态,但可通过重建索引恢复
2.分区表中分区的drop/truncate操作会造成global型(分区)索引变为不可用状态,但可通过重建索引恢复
3.分区表中分区的drop/truncate操作不会造成local型(分区)索引变为不可用状态
4.Oracle要求分区表上的local型唯一/主键约束索引必须包含分区键,且分区键上不容许使用函数
5.唯一/主键约束索引由global改local型须添加分区键,但这会改变其唯一逻辑,因此需要考虑是否满足业务。推荐从从业务逻辑层控制数据唯一性,或对该表唯一性无要求的情况下再进行global改local操作
global型单列主键		local型组合主键		对比说明
id(int)		sj(date)	     id(int)	local型索引须包含分区键(本例为sj列date类型)
1		  2023-01-01 00:00:01	1		global型主键id列全表只能有一个1
2		  2023-01-01 00:00:02	1		local型主键id列全表可以有多个1
3		  2023-01-01 00:00:02	2		local型主键的唯一性体现在组合的最小粒度上
6.若表中数据从来源可保证数据唯一性或对唯一性无要求时,推荐用常规索引代替唯一/主键约束索引
7.唯一/主键约束索引的状态为UNUSABLE/INVALID等异常状态时,一般会阻止表上数据的DML,索引重建后恢复
8.索引的修改属于DDL操作,会对表加不同粒度的锁,推荐在非业务期间执行,如果是7*24的业务需要酌情使用适当的方式
9.索引状态列status有3类值:可用(USABLE/VALID)、不可用(UNUSABLE/INVALID)、未知(N/A)
10.索引相关视图:dba_ind_subpartitions(子分区信息)、dba_ind_partitions(分区信息)、dba_indexes(总信息)
11.Oracle为local型索引创建与分区表相同数量的分区或子分区,并为它们提供与表相应分区相同的分区范围
12.当基础表中的分区added, dropped, merged, or split时,或hash partitions or subpartitions被添加或合并时,Oracle 还会自动维护索引分区
13.如果在分区和索引级别没有用户指定的TABLESPACE值,则使用基础表的相应分区的物理属性的值。
14.唯一约束索引升级为主键约束时,Oracle会给相关列设置not null约束,如果相关列不全有not null约束,Oracle会给该表加独占锁且锁定时长和数据量成正比,锁持续期间表无法增删改查
15.重建索引时可以酌情考虑开启并行加快重建速度,重建完成后须关闭并行
16.重建索引时可以酌情考虑是否使用online方式(适合业务繁忙的场景,速度慢但对表的锁影响教小:仅DDL始末加一小会锁),非online方式(适合业务不忙的场景,速度快但对表的锁影响较大:重建索引期间一直加独占锁)
17.所有改造操作强烈建议进行充分评估和测试,减少投产风险
18.创建/重建索引会消耗归档空间,建议提前排查归档空间是否足够(建议预留超过新索引大小的归档空间,该值为预估值,实际可能有出入,建议预留充足的空间)
19.当基础表分区中的数据被移动或删除(SPLIT、MOVE、DROP或TRUNCATE)时,全局索引的所有分区都会受到影响。因此,全局索引不支持分区独立性。
20.分区表上的普通索引由global改为local型时,需要先删除旧global索引然后新建local索引,期间表上会暂时缺少相关列的索引,如果表上有业务运行可能会因为索引缺失影响性能,建议在非相关业务期间删除+新建。或在相关列上先建立一个临时多列组合索引,再删除旧global索引,然后新建local索引,最后删除临时索引
21.

★ 相关SQL

1.查看分区表上的global型索引
select a.owner, a.table_name, a.index_namefrom dba_part_indexes awhere a.owner = 'USER_NAME' --用户名and a.table_name = 'TABLE_NAME' --表名and a.locality = 'GLOBAL'
union
select b.owner, b.table_name, b.index_namefrom dba_indexes bwhere b.owner = 'USER_NAME'  --用户名and b.table_name = 'TABLE_NAME' --表名and b.partitioned = 'NO';
2.查看索引状态(status列USABLE/VALID代表索引可用/正常)
select s.index_owner,s.index_name,s.partition_name,s.subpartition_name,s.statusfrom dba_ind_subpartitions s where s.index_name = 'INDEX_NAME' --索引名
union all
select p.index_owner, p.index_name, p.partition_name, 'NULL', p.statusfrom dba_ind_partitions p where p.index_name = 'INDEX_NAME' --索引名
union all
select i.owner, i.index_name, 'NULL', 'NULL', i.statusfrom dba_indexes i where i.index_name = 'INDEX_NAME' --索引名
order by 1, 2, 3,4;

★ 测试案例

1.创建/重置测试表和数据
--删表
drop table P;
--建表
create table p (id number,name varchar2(20)) partition by range (id)
(
partition p1 values less than (10) ,
partition p2 values less than (20) ,
partition p3 values less than (30) ,
partition pmax values less than (maxvalue) 
);
--插入实验数据
insert into p values(1,'p1');
insert into p values(11,'p2');
insert into p values(21,'p3');
insert into p values(91,'pmax');
commit; 
2.分区表上global型(非分区)索引的DDL
(1)测试表重置
(2)创建索引
drop index p_global_notpartition;
create index p_global_notpartition on p(id) global online;
(3)查看索引状态(status列应该是:VALID可用状态)
select s.index_owner,s.index_name,s.partition_name,s.subpartition_name,s.statusfrom dba_ind_subpartitions s where s.index_name = 'P_GLOBAL_NOTPARTITION'
union all
select p.index_owner, p.index_name, p.partition_name, 'NULL', p.statusfrom dba_ind_partitions p where p.index_name = 'P_GLOBAL_NOTPARTITION'
union all
select i.owner, i.index_name, 'NULL', 'NULL', i.statusfrom dba_indexes i where i.index_name = 'P_GLOBAL_NOTPARTITION'
order by 1, 2, 3,4;
(4)执行分区DDL操作
alter table p truncate partition p1;
(5)查看索引状态(status列应该是:UNUSABLE不可用状态)
select s.index_owner,s.index_name,s.partition_name,s.subpartition_name,s.statusfrom dba_ind_subpartitions s where s.index_name = 'P_GLOBAL_NOTPARTITION'
union all
select p.index_owner, p.index_name, p.partition_name, 'NULL', p.statusfrom dba_ind_partitions p where p.index_name = 'P_GLOBAL_NOTPARTITION'
union all
select i.owner, i.index_name, 'NULL', 'NULL', i.statusfrom dba_indexes i where i.index_name = 'P_GLOBAL_NOTPARTITION'
order by 1, 2, 3,4;
(6)索引重建
alter index p_global_notpartition rebuild online;
(7)查看索引状态(status列应该是:VALID可用状态)
select s.index_owner,s.index_name,s.partition_name,s.subpartition_name,s.statusfrom dba_ind_subpartitions s where s.index_name = 'P_GLOBAL_NOTPARTITION'
union all
select p.index_owner, p.index_name, p.partition_name, 'NULL', p.statusfrom dba_ind_partitions p where p.index_name = 'P_GLOBAL_NOTPARTITION'
union all
select i.owner, i.index_name, 'NULL', 'NULL', i.statusfrom dba_indexes i where i.index_name = 'P_GLOBAL_NOTPARTITION'
order by 1, 2, 3,4;
(8)小结
分区表中分区的drop/truncate操作会造成global型(非分区)索引变为不可用状态
3.分区表上global型(分区)索引的DDL
(1)测试表重置
(2)创建索引
drop index p_global_partition;
create index p_global_partition on p(id) global partition by range (id)
(
partition p1 values less than (10) ,
partition p2 values less than (20) ,
partition p3 values less than (30) ,
partition pmax values less than (maxvalue) 
) online;
(3)查看索引状态(status列应该是:USABLE可用状态)
select s.index_owner,s.index_name,s.partition_name,s.subpartition_name,s.statusfrom dba_ind_subpartitions s where s.index_name = 'P_GLOBAL_PARTITION'
union all
select p.index_owner, p.index_name, p.partition_name, 'NULL', p.statusfrom dba_ind_partitions p where p.index_name = 'P_GLOBAL_PARTITION'
union all
select i.owner, i.index_name, 'NULL', 'NULL', i.statusfrom dba_indexes i where i.index_name = 'P_GLOBAL_PARTITION'
order by 1, 2, 3,4;
(4)执行分区DDL操作
alter table p truncate partition p1;
(5)查看索引状态(status列应该是:UNUSABLE不可用状态)
select s.index_owner,s.index_name,s.partition_name,s.subpartition_name,s.statusfrom dba_ind_subpartitions s where s.index_name = 'P_GLOBAL_PARTITION'
union all
select p.index_owner, p.index_name, p.partition_name, 'NULL', p.statusfrom dba_ind_partitions p where p.index_name = 'P_GLOBAL_PARTITION'
union all
select i.owner, i.index_name, 'NULL', 'NULL', i.statusfrom dba_indexes i where i.index_name = 'P_GLOBAL_PARTITION'
order by 1, 2, 3,4;
(6)索引重建(分区索引的重建需要在最小粒度上执行,如分区/子分区级)
alter index P_GLOBAL_PARTITION rebuild partition p1 online;
alter index P_GLOBAL_PARTITION rebuild partition p2 online;
alter index P_GLOBAL_PARTITION rebuild partition p3 online;
alter index P_GLOBAL_PARTITION rebuild partition pmax online;
(7)查看索引状态(status列应该是:USABLE可用状态)
select s.index_owner,s.index_name,s.partition_name,s.subpartition_name,s.statusfrom dba_ind_subpartitions s where s.index_name = 'P_GLOBAL_PARTITION'
union all
select p.index_owner, p.index_name, p.partition_name, 'NULL', p.statusfrom dba_ind_partitions p where p.index_name = 'P_GLOBAL_PARTITION'
union all
select i.owner, i.index_name, 'NULL', 'NULL', i.statusfrom dba_indexes i where i.index_name = 'P_GLOBAL_PARTITION'
order by 1, 2, 3,4;
(8)小结
分区表中分区的drop/truncate操作会造成global型(分区)索引整体变为不可用状态
4.分区表上local型(分区)索引的DDL
(1)测试表重置
(2)创建索引
drop index p_local_partition;
create index p_local_partition on p(id) local online;
(3)查看索引状态(status列应该是:USABLE可用状态)
select s.index_owner,s.index_name,s.partition_name,s.subpartition_name,s.statusfrom dba_ind_subpartitions s where s.index_name = 'P_LOCAL_PARTITION'
union all
select p.index_owner, p.index_name, p.partition_name, 'NULL', p.statusfrom dba_ind_partitions p where p.index_name = 'P_LOCAL_PARTITION'
union all
select i.owner, i.index_name, 'NULL', 'NULL', i.statusfrom dba_indexes i where i.index_name = 'P_LOCAL_PARTITION'
order by 1, 2, 3,4;
(4)执行分区DDL操作
alter table p truncate partition p1;
(5)查看索引状态(status列应该是:USABLE可用状态)
select s.index_owner,s.index_name,s.partition_name,s.subpartition_name,s.statusfrom dba_ind_subpartitions s where s.index_name = 'P_LOCAL_PARTITION'
union all
select p.index_owner, p.index_name, p.partition_name, 'NULL', p.statusfrom dba_ind_partitions p where p.index_name = 'P_LOCAL_PARTITION'
union all
select i.owner, i.index_name, 'NULL', 'NULL', i.statusfrom dba_indexes i where i.index_name = 'P_LOCAL_PARTITION'
order by 1, 2, 3,4;
(6)小结
分区表中分区的drop/truncate操作不会造成local型(分区)索引整体变为不可用状态
5.


※ 如果您觉得文章写的还不错, 别忘了在文末给作者点个赞哦 ~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/84760.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从金蝶云星空到金蝶云星空通过接口配置打通数据

从金蝶云星空到金蝶云星空通过接口配置打通数据 源系统:金蝶云星空 金蝶K/3Cloud结合当今先进管理理论和数十万家国内客户最佳应用实践,面向事业部制、多地点、多工厂等运营协同与管控型企业及集团公司,提供一个通用的ERP服务平台。K/3Cloud支持的协同应…

设计模式行为型——访问者模式

目录 访问者模式的定义 访问者模式的实现 访问者模式角色 访问者模式类图 访问者模式举例 访问者模式代码实现 访问者模式的特点 优点 缺点 使用场景 注意事项 实际应用 访问者模式的定义 访问者模式(Visitor Pattern)属于行为型设计模式&am…

【工作中问题解决实践 十一】Kafka消费者消费堆积且频繁rebalance

最近有点不走运,老是遇到基础服务的问题,还是记着点儿解决方法,以后再遇到快速解决吧,今天遇到这个问题倒不算紧急,但也能通过这个问题熟悉一下Kafka的配置。 问题背景 正在开会的时候突然收到一连串的报警&#xff…

HarmonyOS NEXT,生命之树初长成

在不同的神话体系中,都有着关于生命之树的记载。 比如在北欧神话中,一株巨大的树木联结着九大世界,其被称为“尤克特拉希尔”Yggdrasill。在中国的《山海经》中,也有着“建木”的传说,它“有九欘,下有九枸&…

【踩坑系列记录 】Anaconda环境将torch由cpu换成gpu

概要 很早前做过深度学习,配环境之类的坑由于没记录都记不清了。这段时间开始做深度学习的项目,于是用Anaconda给项目创建了一个环境,其他的环境配置很顺利,就是到了安装pytorch时,我用pytorch官网的代码一直下载的是…

MongoDB安装和配置

一、MongoDB安装和配置 1、进入官网下载你所需要的安装版本,点击直通官网 Step1:进入官网后,将看到如下界面,点击上方导航栏Products,找到Community Server Step2:选择自己需要的版本、系统和压缩方式 2、下…

Kubernetes Service 工作原理

本文介绍了 Kubernetes Service 的概念、原理和具体使用。 作者:沈亚军 爱可生研发团队成员,负责公司 DMP 产品的后端开发,爱好太广,三天三夜都说不完,低调低调… 本文来源:原创投稿 爱可生开源社区出品&am…

空降流量危机?QQ音乐升级架构应对高并发

# 关注并星标腾讯云开发者 # 每周3 | 谈谈我在腾讯的架构设计经验 # 第2期 | 赵威:QQ音乐评论系统如何实现高可用? QQ 音乐自诞生以来,已有多个版本的评论业务系统。最新版本是19年再次全新迭代,基于 tlist 存储,按照发…

无法坚持运动?解密肠道菌群影响运动积极性

谷禾健康 运动可以说是最有效和可行的生活方式因素,个人可以利用它来保护自己免受各种疾病的侵害,包括代谢性、心血管、神经退行性和肿瘤性疾病。 世界卫生组织建议,每周进行150-300分钟的中等强度运动。 运动的好处具体不用多说了&#xff0…

MyBatis Plus-个人笔记

前言 学习视频 尚硅谷-Mybatis-Plus教程学习主要内容 本文章记录尚硅谷-Mybatis-Plus教程内容,只是作为自己学习笔记,如有侵扰请联系删除 一、MyBatis-Plus简介 1、简介 MyBatis-Plus(简称 MP)是一个 MyBatis的增强工具&#…

8.10 算法刷题【1道题】

8.10 算法刷题 22. 链表中环的入口结点(快慢指针) 22. 链表中环的入口结点(快慢指针) 原题链接 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x…

Mysql整理

一、基础概念 1. 索引 之前的文章已经写过了,比较细 数据库索引含义,类别,用法,创建方式_表结构加树形id和索引是为什么_马丁•路德•王的博客-CSDN博客 简单概括就是在表的某个列或者多个列或者联合表的时候加个索引,类似图书馆书本的索引编号&…

MachineLearningWu_15/P70-P71_AdamAndConv

x.1 算法参数更新 我们使用梯度下降算法来自动更新参数,但是由于学习率的不好选择性,我们有时候会下降地很快,有时候下降地很慢,我们期望有一种方式能够自动调整学习率的变化,这里引入Adaptive Moment Estimation/Ada…

LabVIEW控制通用工作台

LabVIEW控制通用工作台 用于教育目的的计算机化实验室显着增长,特别是用于运动控制的实验室。它们代表了各种工业应用中不断扩大的领域,并成为以安全的方式使用通常昂贵或独特的实验室设备进行实时实验的宝贵工具。NI LabVIEW等软件应用程序的开发和不断…

LouvainMethod分布式运行的升级之路

1、背景介绍 Louvain是大规模图谱的谱聚类算法,引入模块度的概念分二阶段进行聚类,直到收敛为止。分布式的代码可以在如下网址进行下载。 GitHub - Sotera/spark-distributed-louvain-modularity: Spark / graphX implementation of the distri…

【Echart地图】jQuery+html5基于echarts.js中国地图点击弹出下级城市地图(附完整源码下载)

文章目录 写在前面涉及知识点实现效果1、实现中国地图板块1.1创建dom元素1.2实现地图渲染1.3点击地图进入城市及返回 2、源码分享2.1 百度网盘2.2 123云盘2.3 邮箱留言 总结 写在前面 这篇文章其实我主要是之前留下的一个心结,依稀记得之前做了一个大屏项目的时候&…

mysql高级三:sql性能优化+索引优化+慢查询日志

内容介绍 单表索引失效案例 0、思考题:如果把100万数据插入MYSQL ,如何提高插入效率 (1)关闭自动提交,只手动提交一次 (2)删除除主键索引外其他索引 (3)拼写mysql可以执…

解释器模式-自定义语言的实现

有时,我们希望输入一串字符串,然后计算机能够按照预先定义的文法规则来对这个字符串进行解释,从而实现相应的功能。 例如,我们想实现简单的加减法接收器,只需输入一个表达式,它就能计算出表达式结果。比如…

专注于创意设计,为您的小程序和网站建设带来更多的可能性

随着移动互联网的快速发展,越来越多的企业开始关注小程序和网站建设,以此来拓展业务和提升品牌形象。 在这个领域中,创意设计扮演着关键的角色。它不仅可以帮助企业打造独特的形象和品牌,还能够提高用户体验和购买决策的效率。 因…

Word转PDF在线转换如何操作?分享转换技巧

现如今,pdf转换器已成为大家日常办公学习必不可少的工具,市场上的pdf转换器主要有两种类型,一种是需要下载安装的,另一种是网页版,打开就可以使用的,今天小编给大家推荐一个非常好用的网页版pdf转换器&…