Oracle 分区索引简介
目录
- 一. 什么是分区索引
- 二. 分区索引的种类
- 2.1 局部分区索引(Local Partitioned Index)
- 2.2 全局分区索引(Global Partitioned Index)
- 三. 分区索引的创建
- 四. 分区索引查看
- 4.1 USER_IND_COLUMNS 表
- 4.2 USER_INDEXES 表
- 五. 分区索引的维护
- 5.1 重新构建索引
- 5.2 删除索引
- 六. 项目中的经验教训
一. 什么是分区索引
在 Oracle 数据库中,分区索引
(Partitioned Index) 是一种与分区表
相关的索引,用于提高分区表上的查询性能和维护效率。
分区索引将数据划分为多个逻辑分区,与表的分区结构紧密关联。这种索引的设计旨在通过限制索引扫描的范围来优化查询性能,尤其是对于大规模数据集。
⏹使用分区索引的契机
- 为了避免移动数据时重建整个索引,可对索引分区,在重建索引时,只需重建与数据分区相关的索引;
- 在对分区表进行维护时,为了避免整个表的索引处于不可用状态,可将索引进行分区。当对分区表进行维护时,只需将该分区表的索引置为不可用状态,并不会影响到其它分区索引的使用;
- 索引表的急剧增长导致索引条目的剧增,使得整个索引表非常大,影响索引速度,需要对索引分区;
二. 分区索引的种类
2.1 局部分区索引(Local Partitioned Index)
- 每个索引分区与表的一个分区
一一对应
。 - 如果删除或维护表中的一个分区,只需对应地删除或维护与之相关的索引分区,操作简单。
- 查询时,Oracle 会自动选择需要访问的索引分区,减少不必要的扫描范围。
- 适用于对分区表的分区列进行查询的场景。
⏹示意图
2.2 全局分区索引(Global Partitioned Index)
- 索引的分区与表的分区没有直接对应关系,而是按索引自己的分区键进行分区。
- 全局分区索引通常在查询涉及非分区键时使用,可以覆盖整个表的所有分区。
- 适合数据访问跨分区的情况,且分区键不是查询的过滤条件时使用。
⏹示意图
三. 分区索引的创建
⏹创建局部(local)分区
索引
CREATE INDEX CHARGEFIXEDWORK_DB1 ON CHARGE_FIXED_WORK (CHARGE_REGST_BUSINS_DATE, CHARGE_NO) LOCAL;
⏹创建全局(global)分区
索引
CREATE INDEX CHARGEFIXEDWORK_DB2 ON CHARGE_FIXED_WORK (ATZT_NO) GLOBAL PARTITION BY HASH (ATZT_NO) PARTITIONS 4;
四. 分区索引查看
4.1 USER_IND_COLUMNS 表
SELECT * FROM USER_IND_COLUMNS WHERE TABLE_NAME = 'CHARGE_FIXED_WORK' ORDER BY INDEX_NAME;
4.2 USER_INDEXES 表
SELECTINDEX_NAME, INDEX_TYPE, TABLE_OWNER, TABLE_NAME, TABLE_TYPE, TO_CHAR(last_analyzed, 'YYYY/MM/DD HH24:MI:SS') AS LAST_ANALYZED
FROMUSER_INDEXES
WHEREINDEX_NAME = 'CHARGEFIXEDWORK_DB1';
五. 分区索引的维护
5.1 重新构建索引
⏹重新构建全局索引
ALTER INDEX global_index_name REBUILD;
- 分区表的某些操作(如
TRUNCATE PARTITION
或DROP PARTITION
)会导致全局索引失效,需要重新维护。 - 在删除指定分区时,重新构建全局索引
ALTER TABLE partitioned_table_name TRUNCATE PARTITION partition_name UPDATE GLOBAL INDEXES;
⏹重新构建本地索引的某个分区
ALTER INDEX local_index_name REBUILD PARTITION partition_name;
5.2 删除索引
- 删除整个索引(包括所有分区)
- 适用于所有类型的索引,包括全局索引和本地索引。
DROP INDEX index_name;
- 删除
本地索引
的指定分区
。 - 本地索引和分区一一对应,每个分区都会有自己的本地索引
- 例如我们一共有4个分区,名称分别叫做SYS_P564,SYS_P565,SYS_P566,SYS_P567
- 这4个分区都有自己的本地索引,名称叫做
CHARGEFIXEDWORK_DB1
- 我们现在只想删除
SYS_P567
分区上的本地索引,保留剩余分区的本地索引
ALTER INDEX local_index_name DROP PARTITION partition_name;
六. 项目中的经验教训
从XX年X月开始,围绕DB出现了各种竞合,其中对于同一个index的登录处理时,TXindex contention
的问题频发。
也是从去年开始,几乎每个月都会人工的做下面几点,来解决此问题。
- index的本地化(把global index变成local index)
- 不要的index的删除
经调查,往往是在数据parten比较少
的项目上加的index会有上述问题。
比如,登录年月日,区分等。
这种项目在登录时,一般只会登录当天的日期,或登录少数的区分值。
如果这些项目上做了gobalindex的话,根据DDL的定义,往往有256个分区来存储这个index。
在登录处理里,写入index的时候,oracle会优先把内容一样的数值放到相同的分区中以便今后的检索查找方便。
但这样一来,tps比较高的登录机能,就会对某一个分区进行高速的写入,最终导致TXindex contention
的发生。
而使用local Index
的话,则发生竞合的概率会变的很低。
★今后的要求★
案件开发时,需要加新TBL的时候,如果表里面有日期,区分等上述的项目并且要对这样的项目添加index的话,
要检讨是否应该用local index
。
⏹参考
在插入分区时,oracle的Local index和Global index的算法有以下不同之处:
Local Index算法:对于Local Index,每个分区会有独立的索引副本,其索引的建立和维护只针对当前分区的数据。
当插入新的分区时,oracle会为该分区建立独立的索引副本,这些分区索引可以并行建立,
因此在分区插入时可以获得更好的性能。这对于分区表的查询和维护操作来说是最有效的选择。Global Index算法:对于G1obal Index,所有分区共字同一个索引副本,索引的建立和维护是针对整个表的。
因此,在插入新的分区时,需要对整个索引进行更新和重建,这可能涉及到大量的数据移动和索引重建,导致性能下降。
因此,在插入分区时,Global Index相对于Local Index来说性能较低。
综上所述,当频繁进行分区插入操作时,Local Index相对于Global ndex来说更加高效和适用。
但是Local Index也对存储需求有较高的要求,因为每个分区都需要存放一个独立的索引副本。
相关文章:

Oracle 分区索引简介
目录 一. 什么是分区索引二. 分区索引的种类2.1 局部分区索引(Local Partitioned Index)2.2 全局分区索引(Global Partitioned Index) 三. 分区索引的创建四. 分区索引查看4.1 USER_IND_COLUMNS 表4.2 USER_INDEXES 表 五. 分区索…...

【科技赋能未来】NDT2025第三届新能源数字科技大会全面启动!
随着我国碳达峰目标、碳中和目标的提出,以及经济社会的发展进步,以风电、光伏发电为代表的新能源行业迎来巨大发展机遇,成为未来绿色经济发展的主要趋势和方向。 此外,数字化技术的不断发展和创新,其在新能源领域的应…...

Broker收到消息之后如何存储
1.前言 此文章是在儒猿课程中的学习笔记,感兴趣的想看原来的课程可以去咨询儒猿课堂《从0开始带你成为RocketMQ高手》,我本人觉得这个作者还是不错,都是从场景来进行分析,感觉还是挺适合我这种小白的。这块主要都是我自己的学习笔…...

Mysql--实战篇--SQL优化(查询优化器,常用的SQL优化方法,执行计划EXPLAIN,Mysql性能调优,慢日志开启和分析等)
一、查询优化 1、查询优化器 (Query Optimizer) MySQL查询优化器(Query Optimizer)是MySQL数据库管理系统中的一个关键组件,负责分析和选择最有效的执行计划来执行SQL查询。查询优化器的目标是尽可能减少查询的执行时间和资源消耗ÿ…...

BERT与CNN结合实现糖尿病相关医学问题多分类模型
完整源码项目包获取→点击文章末尾名片! 使用HuggingFace开发的Transformers库,使用BERT模型实现中文文本分类(二分类或多分类) 首先直接利用transformer.models.bert.BertForSequenceClassification()实现文本分类 然后手动实现B…...

rabbitmqp安装延迟队列
在RabbitMQ中,延迟队列是一种特殊的队列类型。当消息被发送到此类队列后,不会立即投递给消费者,而是会等待预设的一段时间,待延迟期满后才进行投递。这种队列在多种场景下都极具价值,比如可用于处理需要在特定时间触发…...

深入探讨DICOM医学影像中的MPPS服务及其具体实现
深入探讨DICOM医学影像中的MPPS服务及其具体实现 1. 引言 在医疗影像的管理和传输过程中,DICOM(数字影像和通信医学)标准发挥着至关重要的作用。除了DICOM影像的存储和传输(如影像存储SCP和影像传输SCP),…...
集合帖:区间问题
一、AcWing 803:区间合并 (1)题目来源:https://www.acwing.com/problem/content/805/ (2)算法代码:https://blog.csdn.net/hnjzsyjyj/article/details/145067059 #include <bits/stdc.h>…...

C#,入门教程(27)——应用程序(Application)的基础知识
上一篇: C#,入门教程(26)——数据的基本概念与使用方法https://blog.csdn.net/beijinghorn/article/details/124952589 一、什么是应用程序 Application? 应用程序是编程的结果。一般把代码经过编译(等)过程&#…...

迅翼SwiftWing | ROS 固定翼开源仿真平台正式发布!
经过前期内测调试,ROS固定翼开源仿真平台今日正式上线!现平台除适配PX4ROS环境外,也已实现APROS环境下的单机飞行控制仿真适配。欢迎大家通过文末链接查看项目地址以及具体使用手册。 1 平台简介 ROS固定翼仿真平台旨在实现固定翼无人机决策…...
CSS 样式 box-sizing: border-box; 详细解读
box-sizing是 CSS 中的一个属性,用于控制元素的盒模型计算方式。border-box值表示元素的宽度和高度将包括内边距(padding)和边框(border),而不仅仅是内容的宽度和高度。这意味着当你为元素设置宽度和高度时…...
FLASK创建下载
html用a标签 <!-- Button to download the image --> <a href"{{ url_for(download_file, filenameimage.png) }}"><button>Download Image</button> </a> 后端:url_for双大括号即是用来插入变量到模板中的语法。也就是绑…...

漫话架构师|什么是系统架构设计师(开篇)
~犬📰余~ “我欲贱而贵,愚而智,贫而富,可乎? 曰:其唯学乎” 关注犬余,共同进步 技术从此不孤单...

Web Socket
Web Socket WebSocket是一种基于TCP的网络通信协议,允许客户端和服务器之间建立全双工(双向)通信通道。WebSocket通过HTTP协议进行握手,建立连接后,客户端和服务器可以在同一个连接上同时发送和接收数据࿰…...

JavaSE学习心得(反射篇)
反射 前言 获取class对象的三种方式 利用反射获取构造方法 利用反射获取成员变量 利用反射获取成员方法 练习 保存信息 跟配置文件结合动态创建 前言 接上期文章:JavaSE学习心得(多线程与网络编程篇) 教程链接:黑马…...

使用FRP进行内网穿透
一、基本概念 内网穿透:它是一种网络技术或方法,旨在允许外部网络(如互联网)访问位于内部网络(内网)中的设备或服务。由于内部网络通常处于NAT(网络地址转换)、防火墙或其他安全机制…...
长安“战疫”网络安全公益赛的一些随想
起因 今年刚进入大学,开始带校队,为了培养校队新成员,也就一直计划着和当地的一些高校合作交流,但是由于种种原因一直被搁置下来。正巧学校信息中心和四叶草有一个培训项目的合作,学校的网安协会也算是沾了光成为了培…...
flutter 安卓端打包
在 Flutter 中打包 Android 应用程序是一个相对简单的过程。你可以使用 Flutter 的命令行工具来构建并打包你的 APK 或 AAB(Android App Bundle)。以下是打包 Flutter Android 应用的步骤: 1. 安装 Flutter 环境 确保你已经安装了 Flutter …...
Cesium中的CustomDataSource 详解
Cesium CustomDataSource 详解 在 Cesium 中,CustomDataSource 是一个强大的类,用于处理自定义的地理数据。它提供了一种方法,可以通过程序方式添加、管理和更新动态的地理实体,而无需依赖外部数据格式(如 GeoJSON 或…...

[Qt]常用控件介绍-按钮类控件-QPushButton、QRedioButton、QCheckBox、QToolButton控件
目录 1.QPushButton按钮 介绍 属性 Demo:键盘方向键控制人物移动 2.Redio Button按钮 属性 clicked、pressed、released、toggled区别 单选按钮的分组 Demo:点餐小程序 3.CheckBox按钮 属性 Demo:获取今天的形成计划 4.ToolBu…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...

c++第七天 继承与派生2
这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分:派生类构造函数与析构函数 当创建一个派生类对象时,基类成员是如何初始化的? 1.当派生类对象创建的时候,基类成员的初始化顺序 …...