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

Oracle 19C分区表索引小结

一、大佬说(杨廷琨)

LOCAL索引的最大好处是在进行分区操作,比如TRUNCATE PARTITION, DROP PARTITION时,不会出现索引INVALID的情况,不影响索引的可用性。由于GLOBAL索引所有的数据存储在一起,因此当执行分区操作的时候,索引会失效,而如果想要保证所有的有效性,需要增加UPDATE (GLOBAL) INDEXES语句,这使得原本很快结束的DDL操作,由于需要维护全局索引而变得非常缓慢,且产生大量的日志。12c之后,全局索引的异步同步可以缓解全局索引的这个问题。

而GLOBAL索引的好处是,在表变为分区后,只要索引仍然是GLOBAL索引,通过索引访问数据的效率就不会下降。由于LOCAL索引的索引分区数量和表分区数量相等,如果访问一个LOCAL索引,且查询条件未指定分区键值,这时Oracle将会扫描所有的索引分区。而GLOBAL索引则只需要访问一棵索引树,当分区数量众多时,二者的效率差异是非常明显的。

当然,它们还有其他的区别。就用户而言,判断需要GLOBAL还是LOCAL索引,最主要看是否会频繁进行分区的维护操作,比如定期删除老分区,如果是的话,LOCAL是最佳选择,如果不是,则考虑GLOBAL索引。

二、索引验证

1、创建临时表

CREATE TABLE TEST1 (hid number,hid2 number,hchar1 char(50)) 

PARTITION BY RANGE(hid) INTERVAL (10)

( PARTITION p01 VALUES LESS THAN (5));

2、创建主键不加USING INDEX LOCAL默认是全局索引

ALTER TABLE TEST1 ADD CONSTRAINT PK_TEST PRIMARY KEY (hid)  --全局索引;

ALTER TABLE TEST1 ADD CONSTRAINT PK_TEST PRIMARY KEY (hid) USING INDEX LOCAL;

3、主键是非分区字段

ALTER TABLE TEST1 ADD CONSTRAINT PK_TEST PRIMARY KEY (hid2)  --正常执行;

ALTER TABLE TEST1 ADD CONSTRAINT PK_TEST PRIMARY KEY (hid2) USING INDEX LOCAL --报错ORA-14039: 分区列必须构成 UNIQUE 索引的关键字列子集;

ALTER TABLE TEST1 ADD CONSTRAINT PK_TEST PRIMARY KEY (hid2,hid) USING INDEX LOCAL  --正常执行;

3、unique索引是非分区字段

create unique index pk_ID on TEST1(HID2) local--报错ORA-14039: 分区列必须构成 UNIQUE 索引的关键字列子集;

create unique index pk_ID on TEST1(HID2,HID) local --正常执行;

create unique index pk_ID on TEST1(HID2) --正常执行;

alter table TEST1 add constraint pk_ID2 primary key(HID2) using index pk_ID --正常执行;

create index pk_ID99 on TEST1(HID2) local --正常执行;

alter table TEST1 add constraint pk_ID99_2 primary key(HID2) using index pk_ID99  --报错ORA-14196: 指定的索引不能用于强制约束条件;

4、非分区字段创建主键,则创建主键local索引时必须加上分区字段

ALTER TABLE TEST ADD CONSTRAINT PK_TEST PRIMARY KEY (主键字段,分区字段) USING INDEX LOCAL;

主键做local索引必须包含分区键的字段。这和oracle 如何保证纪录唯一有关,如果unique index key没有partition_key,那么每插入一行的纪录,只保证它所进入的分区中是唯一的,不保证在整个表上这个记录是否唯一,这就违背了主键的意义。(如果和分区字段一起绑定,则不需要扫描所有的索引分区就能验证整个表上这个记录是否唯一)。

5、range分区

range分区,单个分区内非分区字段的值不是顺序的,分区字段值也不是顺序的(如按100值分区,第一个分区是1-100,顺序可能是7,1,3,67,9这样的,第二分区101-200,顺序可能是199,136,103,178这样的,但是相对两个分区而言,第二个分区和第一个分区值的范围是顺序的)

分区字段的分区索引是顺序的,因为第一个数据分区开始到后面的数据分区是range顺序的,虽然单独的数据分区内数据不是顺序的

非分区字段只是某一分区索引内的索引是顺序的,不代表分区索引是顺序的。

相关文章:

  • 链式二叉树概念和结构
  • 【Java】Mybatis学习笔记
  • HTML5与CSS3新特性详解
  • C++回顾 day1
  • MATRIX-BREAKOUT: 2靶场
  • StarRocks中优雅处理JSON与列表字段的初步示例
  • sass介绍
  • 操作系统IO多路复用select,poll,epoll
  • 英语词性--介词
  • 基于springboot的网上订餐系统(006)
  • python:music21 与 AI 结合应用探讨
  • Unity Enlighten与Progressive GPU Lightmapper对比分析
  • 清晰易懂的 PHP 安装与配置教程
  • 【蓝桥杯速成】| 7.01背包练习生
  • Framebuffer应用编程
  • 科研项目验收管理系统
  • Node.js系列(5)--数据库操作指南
  • 引用拷贝、浅拷贝和深拷贝
  • Pytorch使用手册—自定义 C++ 和 CUDA 运算符(专题五十一)
  • 12、Linux中如何查看一个进程,如何杀死一个进程,如何查看某个端口有没有被占用【中高频】
  • 苏炳添任暨南大学体育学院院长
  • 迎接神十九乘组回家,东风着陆场各项工作已准备就绪
  • 限时离境、关闭领空、暂停贸易,巴基斯坦宣布一系列对印反制措施
  • “茉上茶田”傍大牌诱导加盟续:违规从事特许经营被罚没670余万元
  • 神十九乘组视频祝福第十个中国航天日,展望中华民族登月梦圆
  • 上海市进一步支持汽车置换更新!一图读懂补贴政策实施细则