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顺序的,虽然单独的数据分区内数据不是顺序的

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

相关推荐
likangbinlxa3 小时前
【Oracle11g SQL详解】UPDATE 和 DELETE 操作的正确使用
数据库·sql
r i c k3 小时前
数据库系统学习笔记
数据库·笔记·学习
野犬寒鸦3 小时前
从零起步学习JVM || 第一章:类加载器与双亲委派机制模型详解
java·jvm·数据库·后端·学习
IvorySQL4 小时前
PostgreSQL 分区表的 ALTER TABLE 语句执行机制解析
数据库·postgresql·开源
·云扬·4 小时前
MySQL 8.0 Redo Log 归档与禁用实战指南
android·数据库·mysql
IT邦德4 小时前
Oracle 26ai DataGuard 搭建(RAC到单机)
数据库·oracle
惊讶的猫5 小时前
redis分片集群
数据库·redis·缓存·分片集群·海量数据存储·高并发写
不爱缺氧i5 小时前
完全卸载MariaDB
数据库·mariadb
纤纡.5 小时前
Linux中SQL 从基础到进阶:五大分类详解与表结构操作(ALTER/DROP)全攻略
linux·数据库·sql
jiunian_cn5 小时前
【Redis】渐进式遍历
数据库·redis·缓存