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数据库中,分区索引是针对分区表的一种特殊索引类型,它可以显著提高对于大规模数据集的查询性能。根据索引是否与表的分区...
分区索引可以是局部索引或全局索引,全局索引可以跨越多个分区,而局部索引则只能作用于一个分区。 创建分区索引 创建分区索引可以使用以下语句: ```sql CREATE INDEX <index_name> ON () GLOBAL PARTITION BY ...
全局索引必须是 Prefix 的,全局分区索引只能是 B 树索引。需要注意的是,Oracle 不会自动维护全局分区索引,当我们在对表的分区做修改之后(如对分区作 move,truncate,drop),如果对分区进行维护操作时不加上 ...
表可以按range、hash、list分区,表分区后,其上的索引和普通表上的索引有所不同,oracle对于分区表上的索引分为2类,即局部索引和全局索引,下面分别对这2种索引的特点和局限性做个总结。局部索引local index1.局部...
Oracle 分区与索引是数据库管理系统中用于优化大数据查询的关键技术。Oracle 分区是一种将大表和索引分成可管理的小部分,以提高查询效率、维护性和可用性。这种技术适用于处理海量数据,通过将数据分散到不同的存储...
- **本地索引**: 与表的分区结构紧密相关,每个分区都有自己的索引部分。当表分区发生变化时,本地索引会自动调整,减少了手动维护的工作量。 ### 分区索引的管理 - **增加索引分区**: 需要手动添加新的索引分区。 ...
- **交换分区**:将表的一个分区与另一个表的数据进行交换。 - **合并分区**:将多个分区合并成一个分区。 - **修改列表分区**:添加或删除列表分区的值。 - **拆分分区**:将一个分区细分为两个或更多分区。 - **...
### Oracle 分区与索引详解 #### 一、Oracle 分区概述 在Oracle数据库中,分区是一种物理数据组织技术,它将一个大的表或索引分成多个较小的部分,每个部分都可以独立管理。通过分区,可以显著提高查询性能,简化...
分区索引是指在分区表上创建的索引,分区索引可以提高查询性能,例如,全局索引和分区索引。 全局索引(Global Index) 全局索引是指在分区表上创建的索引,索引包含所有的分区数据,例如: CREATE INDEX idx_...
#### 一、全局索引与分区表的关系 **全局索引**(Global Index)是指索引覆盖整个表的所有数据,而不受限于分区边界。这种类型的索引通常用于非分区列或者跨分区查询。 **实验验证:** 1. **创建分区表:** ...
### MS SQL Server 分区表、分区索引详解 #### 一、分区表简介 使用分区表的主要目的是为了改善大型表及具有多种访问模式的表的可伸缩性和可管理性。这里的“大型表”指的是数据量巨大的表,“访问模式”是指因不同...
分区索引可以是全局索引或本地索引,全局索引可以独立于分区表,而本地索引的分区形式与表的分区相同。 分区方式 Oracle数据库中提供了多种分区方式,包括Range分区、Hash分区、List分区和组合分区等。 * Range...
根据提供的文件信息,我们可以深入探讨数据库的索引理论与分区技术。这不仅涵盖了索引的基础概念,还涉及了具体的实现方法及其对性能的影响,并且详细介绍了分区策略在大型数据库系统中的应用。 ### 数据库索引 ##...
虽然存储介质和数据处理技术的发展也很快,但是仍然不能满足用户的需求,为了使用户的大量的数据在读写操作和查询中速度更快,Oracle提供了对表和索引进行分区的技术,以改善大型应用系统的性能。
- **本地索引**:索引的分区与表的分区保持一致,适用于大多数情况下的查询。维护本地索引时,表的分区变更会自动反映到索引上。 ### 结论 分区技术是Oracle数据库中一项非常强大的功能,它可以显著提高大数据量表...
分区索引与表分区相对应,而全局索引则跨越所有分区。非分区表可以拥有分区或非分区索引,但分区表必须至少有一个分区键,最多可包含16个列,这些列可以是可为空的。 在应用分区时,重要的是保持分区的逻辑一致性,...