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 PARTITIONDROP 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也对存储需求有较高的要求,因为每个分区都需要存放一个独立的索引副本。

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

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

相关文章

​HPM6700——以太网通信lwip_udpecho_freertos_socket

1. 概述 本示例展示在FreeRTOS系统下的UDP回送通讯 PC 通过以太网发送UDP数据帧至MCU,MCU将接收的数据帧回发至PC 2. 硬件设置 使用USB Type-C线缆连接PC USB端口和PWR DEBUG端口 使用以太网线缆连接PC以太网端口和开发板RGMII或RMII端口 3. 工程配置 以太网端…

STC的51单片机LED点灯基于KEIL

前言: 该文源于回答一个朋友的问题,代码为该朋友上传,略作修改,在此说明问题以及解决问题的思路,以减少新手错误。 电路图: 该位朋友未上传电路图,说明如下: stc8g1k08a-sop8控制…

[leetcode]链表基础回顾

一.创建带头节点的链表 #include <iostream> #include <string> #include <algorithm> using namespace std; typedef struct Node { char ch; Node* next; }*LinkList,ListNode; void printLinkList(LinkList& head) { LinkList p head…

Cesium在vue3中的简单使用

目录 一、介绍 二、创建和基础配置 2.1 使用vite创建vue3项目 2.2 安装所需依赖 2.3 修改配置文件vite.config.js 2.4 配置路由文件 2.5 使用路由文件 三、使用cesium原本的进行渲染 3.1 渲染效果 3.2 代码实现 3.2.1 默认效果代码 3.2.2 空白地图效果代码 3.2.3 修改默…

【Uniapp-Vue3】使用defineExpose暴露子组件的属性及方法

如果我们想要让父组件访问到子组件中的变量和方法&#xff0c;就需要使用defineExpose暴露&#xff1a; defineExpose({ 变量 }) 子组件配置 父组件配置 父组件要通过onMounted获取到子组件的DOM 传递多个属性和方法 子组件 父组件

小米vela系统(基于开源nuttx内核)——openvela开源项目

前言 在 2024 年 12 月 27 日的小米「人车家全生态」合作伙伴大会上&#xff0c;小米宣布全面开源 Vela 操作系统。同时&#xff0c;OpenVela 项目正式上线 GitHub 和 Gitee&#xff0c;采用的是比较宽松的 Apache 2.0 协议&#xff0c;这意味着全球的开发者都可以参与到 Vela…

1.15寒假作业

web&#xff1a;nss靶场ez_ez_php 打开环境&#xff0c;理解代码 使用个体传参的方法&#xff0c;首先代码会检查file参数的前三个字符是不是php&#xff0c;如果是就输出nice&#xff0c;然后用include函数包含file&#xff0c;绕过不是则输出hacker&#xff0c;如果没有file…

openharmony display

https://github.com/openharmony/drivers_peripheral/blob/master/display/README_zh.md 源码路径&#xff0c;这里是对rk3588的display层适配 device/soc/rockchip/rk3588/hardware/display ├── include └── src ├── display_device &#xff08;代码量最大的部分&…

如何在linux系统上完成定时任务

任务背景 1.需要每小时更新一次github的host端口&#xff1b; 2.需要每天早上七点半准时启动电脑。 更新github的host端口 在/past/to/路径里新建一个host_update.sh文件&#xff0c;运行以下命令获得访问&#xff0c;运行和修改这个文件路径的权限&#xff1a; sudo chmod…

osg中实现模型的大小、颜色、透明度的动态变化

以博饼状模型为对象,实现了模型大小、颜色、透明度的动态变化。 需要注意的是一点: // 创建材质对象osg::ref_ptr<osg::Material> material = new osg::Material;material->setDiffuse(osg::Material::FRONT_AND_BACK, osg::Vec4(0.0, 1.0, 0.0, 0.5));// 获取模型的…

golang之数据库操作

1.导入必要的包 import("database/sql"_ "github.com/go-sql-driver/mysql" //使用此作为数据库驱动 ) 2.相关操作 连接数据库 使用sql.Open()函数进行数据库的连接 db, err : sql.Open("mysql", "user:passwordtcp(127.0.0.1:3306)/db…

为ARM64架构移植Ubuntu20.04换源的发现

在为ARM64架构(RK3566)移植ubuntu20.04的时候发现在更换为国内源之后&#xff0c;无法正常完成apt update,报错为: Ign:25 http://mirrors.aliyun.com/ubuntu focal-updates/main arm64 Packages …

源码编译安装httpd 2.4,提供系统服务管理脚本并测试

总结需要安装的包 sudo yum groupinstall "Development Tools" -y #httpd的依赖包yum install tar -y #tar压缩包sudo yum install apr-devel apr-util-devel #APR库 提供跨平台接口的库sudo yum install pcre pcre-devel # PCRE库和 pcre-config工具--提供PCRE库…

【混合开发】CefSharp+Vue桌面应用程序开发

为什么选择CefSharpVue做桌面应用程序 CefSharp 基于 Chromium Embedded Framework (CEF) &#xff0c;它可以将 Chromium 浏览器的功能嵌入到 .NET 应用程序中。通过 CefSharp&#xff0c;开发者可以在桌面应用程序中集成 Web 技术&#xff0c;包括 HTML、JavaScript、CSS 等…

从0开始学习搭网站第二天

前言&#xff1a;今天比较惭愧&#xff0c;中午打铲吃了一把&#xff0c;看着也到钻二了&#xff0c;干脆顺手把这个赛季的大师上了&#xff0c;于是乎一直到网上才开始工作&#xff0c;同样&#xff0c;今天的学习内容大多来自mdn社区mdn 目录 怎么把文件上传到web服务器采用S…

nacos环境搭建以及SpringCloudAlibaba脚手架启动环境映射开发程序

1&#xff1a;下载nacos 地址&#xff1a;https://github.com/alibaba/nacos/tags 2:选择server的zip包下载 3:启动mysql服务&#xff0c;新建数据库&#xff1a;nacos_yh 4&#xff1a;解压下载的nacos_server 进入conf目录 5&#xff1a;mysql运行sql脚本变得到下面的表 6&a…

Spring MVC流程一张图理解

由于现在项目中大部分都是使用springboot了&#xff0c;但是ssm中的springmvc还是可以了解一下 1 、用户发送请求至前端控制器 DispatcherServlet 。 2 、 DispatcherServlet 收到请求调用 HandlerMapping 处理器映射器。 3 、处理器映射器找到具体的处理器 ( 可以根据 xml 配…

数据分析如何正确使用ChatGPT进行辅助?

目录 1.数据介绍 2.特征工程 3.EDA分析 4.数据相关性分析 5.分析总结 一篇优秀的学术论文&#xff0c;肯定有新颖、适当的论证视角&#xff0c;选择恰当的研究方法&#xff0c;搭建逻辑严密、平衡的论证框架&#xff0c;把有力的数据分析紧密结合起来&#xff0c;这样一篇…

学习 Git 的工作原理,而不仅仅是命令

Git 是常用的去中心化源代码存储库。它是由 Linux 创建者 Linus Torvalds 创建的&#xff0c;用于管理 Linux 内核源代码。像 GitHub 这样的整个服务都是基于它的。因此&#xff0c;如果您想在 Linux 世界中进行编程或将 IBM 的 DevOps Services 与 Git 结合使用&#xff0c;那…

赛灵思(Xilinx)公司Artix-7系列FPGA

苦难从不值得歌颂&#xff0c;在苦难中萃取的坚韧才值得珍视&#xff1b; 痛苦同样不必美化&#xff0c;从痛苦中开掘出希望才是壮举。 没有人是绝对意义的主角&#xff0c; 但每个人又都是自己生活剧本里的英雄。滑雪&#xff0c;是姿态优雅的“贴地飞行”&#xff0c;也有着成…