Oracle 12c
-- 创建普通表
create table test.t_test1 (
c1 number not null,
c2 number not null,
c3 number not null
);
-- 局部索引,报错:ORA-14016: 必须对 LOCAL 分区索引的基础表进行分区
drop index test.t_test1_idx1;
create index test.t_test1_idx1 on test.t_test1 (c1) local;
-- 全局索引+未分区,无意义;相当于普通索引
drop index test.t_test1_idx2;
create index test.t_test1_idx2 on test.t_test1 (c1) global;
-- 全局索引+已分区,索引列 等于 索引分区列 或者 满足从左匹配 包含索引分区列
drop index test.t_test1_idx3;
create index test.t_test1_idx3 on test.t_test1 (c1,c2) global
partition by hash (c1);
-- 全局索引+已分区,索引列 既不等于 索引分区列 也不满足 从左匹配 包含索引分区列,报错:ORA-14038: GLOBAL 分区索引必须加上前缀
drop index test.t_test1_idx4;
create index test.t_test1_idx4 on test.t_test1 (c1) global
partition by hash(c2);
总结:针对没有分区的表来说,无法使用局部索引,可以使用全局(分区/未分区)索引,但是意义不大;
通常是数据容量、或者说索引容量很大时,对其进行分区,提升性能;既然表未分区,说明未达到性能瓶颈,可以不作索引分区;所以下述重点演示 局部索引分区,全局索引分区
-- 分区表
create table test.t_test2 (
c1 number not null,
c2 number not null,
c3 number not null
) partition by hash (c1) partitions 3;
-- 局部索引+前缀,索引列 等于 分区列,
drop index test.t_test1_idx1;
create index test.t_test1_idx1 on test.t_test2 (c2, c1) local;
-- 局部索引+非前缀,索引列 不等于 分区列
drop index test.t_test1_idx2;
create index test.t_test1_idx2 on test.t_test2 (c2) local;
注:局部索引的分区方式 和 主表的分区方式是一样的,所以局部索引的分区方式:HASH,分区列:c1,分区数:3 这是一个隐含的条件;
-- 全局索引+未分区,无意义;相当于普通索引
drop index test.t_test1_idx3;
create index test.t_test1_idx3 on test.t_test2 (c1) global;
-- 全局索引+已分区+前缀,索引列必须(等同于索引分区列,或者 满足左匹配索引分区列 )
drop index test.t_test1_idx5;
create index test.t_test1_idx5 on test.t_test2 (c2,c1) global
partition by hash (c2);
-- 全局索引+已分区+非前缀,报错:ORA-14038: GLOBAL 分区索引必须加上前缀
drop index test.t_test1_idx5;
create index test.t_test1_idx5 on test.t_test2 (c1) global
partition by hash(c2);
总结:局部索引可以支持前缀,或者非前缀;全局索引必须是前缀;
值得思考的问题:
1. 如何理解局部索引可以是 前缀 或 非前缀,全局索引必须是前缀?
2. 如何理解局部分区索引的前缀 & 非前缀的本质区别?
3. 如何理解局部索引 & 全局索引的实际应用场景?
4. 如何理解局部分区索引 & 全局分区索引唯一性?
5. 如何理解局部分区索引 & 全局分区索引的管理?
如何查看索引分区类型,是否前缀等信息?
select index_name,partitioning_type,subpartitioning_type,locality,alignment from all_part_indexes where owner=?;
About Partition Pruning:
http://www.dba-oracle.com/t_partition_pruning.htm
https://dev.mysql.com/doc/refman/8.0/en/partitioning-pruning.html
注意:优化器是否启用 Partition Pruning 要结合查询条件来看,网上不少资料介绍说:Local Prefixed 启用 Partition Pruning 优化,而 Non-Prefixed 则不会启用这项优化;这里可能有误解
WHERE 包含: 完整的分区列,无论是 Prefixed 或 Non-Prefixed 优化器都会启用 Partition Pruning 优化
WHERE 不包含:完整的分区列,优化器都不会启用 Partition Pruning 优化
相关推荐
oracle 分区索引,本地索引,全局索引的区别
ORACLE 分区表 分区索引 索引分区 实例讲解
表可以按range、hash、list分区,表分区后,其上的索引和普通表上的索引有所不同,oracle对于分区表上的索引分为2类,即局部索引和全局索引,下面分别对这2种索引的特点和局限性做个总结。局部索引local index1.局部...
分区索引 分区索引 分区索引 分区索引分区索引分区索引分区索引分区索引
oracle索引与分区索引介绍 删除分区 分区合并(从中间删除掉一个分区,或者两个分区需要合并后减少分区数量) 创建新的分区 交换分区
虽然存储介质和数据处理技术的发展也很快,但是仍然不能满足用户的需求,为了使用户的大量的数据在读写操作和查询中速度更快,Oracle提供了对表和索引进行分区的技术,以改善大型应用系统的性能。
总结描述Oracle 11g分区表的种类及分区索引的类型。范围分区,列表分区,散列分区,组合分区,哈希分区,全局索引,分区索引
MS SQL Server:分区表、分区索引 详解 1. 分区表简介 使用分区表的主要目的,是为了改善大型表以及具有各种访问模式的表的可伸缩性和可管理性。 大型表:数据量巨大的表。 访问模式:因目的不同,需访问的...
对orcle大数据的查询的优化,ORACLE分区表、分区索引ORACLE对于分区表方式其实就是将表分段存储,一般普通表格是一个段存储,而分区表会分成多个段,所以查找数据过程都是先定位根据查询条件定位分区范围,即数据在...
Oracle表分区和索引分区 分区概述 为了简化数据库大表的管理,例如在数据仓库中一般都是TB级的数量级.ORACLE8以后推出了分区选项.分区将表分离在若于不同的表空间上,用分而治之的方法来支撑元限膨胀的大表,组...
oracle索引分区实践笔记,该笔记中详细描述Oracle的分区索引中的局部索引,全局索引使用中的区别,理解上的差异,执行中的不同,并附相关脚本
分区索引(或索引分区)主要是针对分区表而言的。随着数据量的不断增长,普通的堆表...b、分区索引可以分为本地分区索引以及全局分区索引 本地分区索引: 本地分区索引信息的存放依赖于父表分区。也就是说对于本地索
全面学习分区表及分区索引二全面学习分区表及分区索引二
如何创建,管理分区,分区索引。
全面学习分区表及分区索引一全面学习分区表及分区索引一
对于oracle分区表分区索引的详细说明。 详细描述了分区表的类型,分区索引的类型 分类 。 删除或truncate 表分区时,什么样的情况索引会失效 需要重建 ,什么时候 对索引 没影响 。
深入学习分区表及分区索引(详解oracle分区).docx
全面学习分区表及分区索引-Oracle.pdf
MSSQLServer:分区表、分区索引详解[归类].pdf