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.
※ 如果您觉得文章写的还不错, 别忘了在文末给作者点个赞哦 ~
相关文章:

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 opera…...
基于2.4G RF开发的无线游戏手柄解决方案
平时喜欢玩游戏的朋友,肯定知道键鼠在某些类型的游戏适配和操作方面,不如手柄。作为一个游戏爱好者,还得配上一个游戏手柄才行。比如动作和格斗、体育游戏,由于手柄更合理的摇杆位置和按键布局,操作起来也是得心应手。…...
Python之一:基础信息
#查看pip版本,cmd命令窗口(注意环境变量%PYTHON_HOME%\scripts,是否在path中) pip --version #安装pip,cmd命令窗口 python -m pip install pip #查看已安装模块,cmd命令窗口 python -m pydoc modules #查看…...

K8S系列文章之 Traefik快速入门
traefik 与 nginx 一样,是一款优秀的反向代理工具,或者叫 Edge Router。至于使用它的原因则基于以下几点 无须重启即可更新配置自动的服务发现与负载均衡与 docker 的完美集成,基于 container label 的配置漂亮的 dashboard 界面metrics 的支…...

RabbitMQ在CentOS下的安装
RabbitMQ的版本是3.8.2 1.环境配置:CentOs 7.6以上版本,我的版本是7.9,不要对yum换源,否则可能会安装失败。 echo "export LC_ALLen_US.UTF-8" >> /etc/profile source /etc/profile 以上命令,是…...

为什么金鸣识别不做成离线版?
来百度APP畅享高清图片 在众多的用户咨询中,金鸣识别客服常常会被用户问及为何不做成离线版的问题,下面我就在这里跟大伙说说其中的原因吧。 离线版的OCR准确率相对于网络版可能会较低,主要有以下几个原因: 1. 数据量和模型更新…...

什么是面向对象
目录 对象: 举例: 封装: 好处: 继承: 多态: 类和对象之间的关系 对象: 把一个东西看成对象,我们就可以孤立的审查它的性质,行为,进而研究它和其他对象的关系。 对象是一个应用系统中用…...

记一次前端直接上传图片到oss报错
前端直接上传图片到阿里云oss,相关过程官网和网上资料已经很详细,不做赘述。 但这个过程比较复杂,前后端对接过程中很容易出现报错,这里遇到了以下报错,不容易排查。 请求显示net::ERR_NAME_NOT_RESOLVED错误,catch输…...
数据库管理-第九十八期 统计信息是多么重要(20230812)
数据库管理-第九十八期 统计信息是多么重要(20230812) 每天通过EM可视化巡视数据库执行情况,发现那些执行比较长的语句要么是索引没用上、要么是索引没建。但更多的是发现执行计划中“估计的行数”与“行数”(执行的)…...

山西电力市场日前价格预测【2023-08-13】
日前价格预测 预测明日(2023-08-13)山西电力市场全天平均日前电价为351.64元/MWh。其中,最高日前电价为404.00元/MWh,预计出现在19: 30。最低日前电价为306.39元/MWh,预计出现在13: 15。 价差方向预测 1: 实…...

AtCoder Beginner Contest 313D题题解
文章目录 [ Odd or Even](https://atcoder.jp/contests/abc313/tasks/abc313_d)问题建模问题分析1.分析每次查询的作用2.利用异或运算的性质设计查询方法 Odd or Even 问题建模 有n个数,每个数为0或者1,最多可以进行n次询问,每次询问选择k个…...
mybatis 中的<![CDATA[ ]]>用法及说明
<![CDATA[ ]]>作用 <![CDATA[ ]]> 在mybatis、ibatis等书写SQL的xml中比较常见,是一种XML语法,他的作用是 可以忽略xml的转义(在该标签中的语句和字符原本是什么样的,在拼接成SQL后还是什么样的) 使用&a…...
从零学算法34
34.给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target,返回 [-1, -1]。 你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。 示例 1࿱…...

qiankun-微前端--vue2
项目结构 主应用技术: vue2 子应用技术:vue2 项目目录 这里是特意将主子项目分开来的,方便管理 主应用 安装 qiankun npm install qiankun重新定义一个启动端口,防止和其它子应用共用同一个端口(vue.config.js&…...

Win7累积补丁更新包_UpdatePack7R2-23.8.10
UpdatePack7是最新的Win7补丁累积更新包,Windows 7更新补丁安装包,Win7累积更新离线安装包包括所有关键更新和安全更新及Internet Explorer所有版本的更新,此外还集成了NVMe驱动和USB3.0驱动,使用它还可以将累积更新封装到系统内&…...

【二叉树】1-5,理论基础、前中后序遍历的递归法和迭代法、层序遍历
理论基础、前中后序遍历的递归法和迭代法、层序遍历 1,二叉树的种类满二叉树完全二叉树二叉搜索树平衡二叉搜索树 2,存储方式链式存储线式存储 3,二叉树的遍历深度优先搜索前序遍历(递归法、迭代法)中序遍历࿰…...

Mybatis-plus动态条件查询QueryWrapper的使用
Mybatis-plus动态条件查询QueryWrapper的使用 一:queryWrapper介绍 queryWrapper是mybatis plus中实现查询的对象封装操作类,可以封装sql对象,包括where条件,order by排序,select哪些字段等等,他的层级关…...

Redis安装配置远程连接
1. yum 安装 redis: 直接使用命令,将 redis 安装到 linux 服务器中: yum -y install redis 2. 启动 redis: 在 xshell 里,可以使用下面命令,以后台方式启动 redis: [rootVM-8-17-centos /]…...

pycharm中配置conda
安装好pycharm和conda后,打开pycharm:...

matlab解常微分方程常用数值解法1:前向欧拉法和改进的欧拉法
总结和记录一下matlab求解常微分方程常用的数值解法,本文先从欧拉法和改进的欧拉法讲起。 d x d t f ( x , t ) , x ( t 0 ) x 0 \frac{d x}{d t}f(x, t), \quad x\left(t_{0}\right)x_{0} dtdxf(x,t),x(t0)x0 1. 前向欧拉法 前向欧拉法使用了泰勒展开的第…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝
目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为:一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...
jmeter聚合报告中参数详解
sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample(样本数) 表示测试中发送的请求数量,即测试执行了多少次请求。 单位,以个或者次数表示。 示例:…...

yaml读取写入常见错误 (‘cannot represent an object‘, 117)
错误一:yaml.representer.RepresenterError: (‘cannot represent an object’, 117) 出现这个问题一直没找到原因,后面把yaml.safe_dump直接替换成yaml.dump,确实能保存,但出现乱码: 放弃yaml.dump,又切…...
TCP/IP 网络编程 | 服务端 客户端的封装
设计模式 文章目录 设计模式一、socket.h 接口(interface)二、socket.cpp 实现(implementation)三、server.cpp 使用封装(main 函数)四、client.cpp 使用封装(main 函数)五、退出方法…...
从实验室到产业:IndexTTS 在六大核心场景的落地实践
一、内容创作:重构数字内容生产范式 在短视频创作领域,IndexTTS 的语音克隆技术彻底改变了配音流程。B 站 UP 主通过 5 秒参考音频即可克隆出郭老师音色,生成的 “各位吴彦祖们大家好” 语音相似度达 97%,单条视频播放量突破百万…...
2025.6.9总结(利与弊)
凡事都有两面性。在大厂上班也不例外。今天找开发定位问题,从一个接口人不断溯源到另一个 接口人。有时候,不知道是谁的责任填。将工作内容分的很细,每个人负责其中的一小块。我清楚的意识到,自己就是个可以随时替换的螺丝钉&…...
深度解析云存储:概念、架构与应用实践
在数据爆炸式增长的时代,传统本地存储因容量限制、管理复杂等问题,已难以满足企业和个人的需求。云存储凭借灵活扩展、便捷访问等特性,成为数据存储领域的主流解决方案。从个人照片备份到企业核心数据管理,云存储正重塑数据存储与…...