一. 概述
和表分区一样,索引也可以进行分区。oracle中对索引进行分区有两种方式:
1. 每一个索引分区对应一个表分区,而且只索引该表分区。也就是有多少个表分区就有多少个索引分区。称之为局部分区索引。
2. 索引按照区间分区(或者散列分区),一个索引可以指向任何表分区的数据。索引分区个数与表分区个数没有关系,称之为全局分区索引。
二. 局部索引
oracle中有两类局部索引:局部前缀索引和局部非前缀索引。看例子:
CREATE TABLE partitioned_table ( a int, b int, data char(20) )
PARTITION BY RANGE (a)
( PARTITION part_1 VALUES LESS THAN(2) tablespace p1,
PARTITION part_2 VALUES LESS THAN(3) tablespace p2 )
如上语句创建了一个表,分成了2个区。a小于2的放在part_1区,a大于2小于3的放在part_2区。接着我们创建两个局部索引:
<!--局部前缀索引(索引的第一列为分区键)-->
create index local_prefixed on partitioned_table (a,b) local;
<!--局部非前缀索引(索引的第一列非分区键,比如(b,a))-->
create index local_nonprefixed on partitioned_table (b) local;
往表里面插入一些数据:
insert into partitioned_table select mod(rownum-1,2)+1, rownum, 'x' from all_objects;
将表空间p2离线,也就是part_2分区变成不可用:
alter tablespace p2 offline;
执行如下查询:
select * from partitioned_table where a = 1 and b = 1;
能够执行成功,使用的局部前缀索引,只查询了part_1分区。
执行第二个查询:
select * from partitioned_table where b = 1;
执行失败,使用的局部非前缀索引,其实这里与使用哪一种类型的局部索引木有关系,b=1的数据不能确定都在part_1区,故part_2分区也需要查找,由于part_2分区已经不可用,故查询失败。
将局部前缀索引删除,继续查询如下:
drop index local_prefixed;
select * from partitioned_table where a = 1 and b = 1;
执行成功,这个时候只能使用局部非前缀索引,也只会扫描part_1分区,因为表分区已经定义了a小于2的值放在part_1分区。
因此,扫描哪些表分区,不扫描哪些表分区与使用什么类型的局部索引没有关系,只与表分区机制相关。
那么,什么情况使用局部前缀索引,什么情况使用局部非前缀索引呢?这个主要看你主要进行什么样的查询。比如:你主要会进行如下查询:select ... from partitioned_table where a = :a and b = :b; 那么在(a,b)列上建立一个局部前缀索引很合适。如果除开上面那个查询很频繁,下面这个查询也很频繁:select ... from partitioned_table where b = :b;那么在(b,a)上建立一个非前缀索引很合适。
三. 全局索引
与局部索引不同,全局索引只有一类,前缀全局索引。也就是全局索引的索引键应该从索引的分区键开始,无论用什么属性对索引分区,这些属性必须是索引键的前几列。比如:
CREATE TABLE partitioned ( timestamp date, id int )
PARTITION BY RANGE (timestamp)
( PARTITION part_1 VALUES LESS THAN ( to_date('01-jan-2000','dd-mon-yyyy') ) ,
PARTITION part_2 VALUES LESS THAN ( to_date('01-jan-2001','dd-mon-yyyy') ) )
创建分区表,以timestamp列分区,接着运行如下SQL语句建立一个全局索引
create index partitioned_index on partitioned(id)
GLOBAL
partition by range(id)
( partition part_1 values less than(1000),
partition part_2 values less than (MAXVALUE) )
这个全局索引的索引键是id,索引的分区键是id。如果索引键指定为(timestamp,id)就会报错。
那么什么情况下使用局部索引,什么情况使用全局索引。这还是要看你需要查找什么样的数据。假如一个客户信息表,是按照客户的注册时间(regist_time)进行表分区的。如果我们要查找注册时间从date1到date2中姓王的所有客户信息,这个时候适合在客户名称(name)上建立一个局部索引。因为我们很可能只要查找一个表分区或者几个表分区,而不是所有的表分区都要扫描。但是,如果我们要查找的是某某地区姓王的客户信息。这个明显要扫描所有表分区,那么要建立一个全局索引在地区字段和姓名字段上。
分享到:
相关推荐
Oracle 索引与分区索引介绍 Oracle 索引与分区索引是 Oracle 数据库中两个重要的概念,它们都是为了提高查询性能和数据存储效率而设计的。在本文中,我们将详细介绍 Oracle 索引与分区索引的概念、特点、分类、创建...
- **重编译索引分区**:当索引分区损坏或需要更新统计信息时,需要重新构建索引分区。 - **重命名索引分区**:更改索引分区的名称。 - **拆分索引分区**:将索引分区拆分为两个或更多分区。 - **修改索引分区默认...
对于本地索引,Oracle 会自动维护其索引分区。 五、查询分区索引信息 可以使用以下语句来查询分区索引信息: ```sql SELECT * FROM ALL_PART_TABLES WHERE OWNER='MMS' AND TABLE_NAME='CMS_OPERATE_LOG'; SELECT...
虽然存储介质和数据处理技术的发展也很快,但是仍然不能满足用户的需求,为了使用户的大量的数据在读写操作和查询中速度更快,Oracle提供了对表和索引进行分区的技术,以改善大型应用系统的性能。
Oracle 分区与索引是数据库管理系统中用于优化大数据查询的关键技术。Oracle 分区是一种将大表和索引分成可管理的小部分,以提高查询效率、维护性和可用性。这种技术适用于处理海量数据,通过将数据分散到不同的存储...
- **分区消除**:前缀和非前缀索引都支持索引分区消除,但前提是查询条件中需包含索引分区键。 - **唯一性约束**:本地索引只支持分区内的唯一性,如果要在表上设置唯一性约束,必须包含分区键列。 - **可用性**:...
Oracle 分区表及分区索引 Oracle 分区表是指将一个大表分割成多个小表,每个小表称为一个分区,分区表的优点是可以提高查询性能、改善管理型、增强容错性等。 分区表的分类: 1. 范围分区(Range Partitioning) ...
表可以按range、hash、list分区,表分区后,其上的索引和普通表上的索引有所不同,oracle对于分区表上的索引分为2类,即局部...5.前缀和非前缀索引都可以支持索引分区消除,前提是查询的条件中包含索引分区键。6.局部
- **全局索引分区**:与分区表关联的索引,支持跨分区的查询。 - **局部索引分区**:仅索引特定分区的数据。 ##### 2. 索引的优缺点 - **优点**: - 加快查询速度。 - 提高数据完整性。 - **缺点**: - 占用...
oracle索引和表分区,oracle索引,oracle表分区
- 索引分区:针对表的索引进行分区,提升查询效率。 - 材料化视图分区:用于加速复杂查询的预计算结果。 - 材料化视图索引分区:加速材料化视图的访问。 3. **分区透明性**: - SQL和DML操作对分区是透明的,...
Oracle分区技术是一种数据库管理系统(DBMS)特性,用于将大型表和索引分割成更小、更易管理和处理的部分,从而提升查询性能和数据管理效率。这种技术特别适用于数据仓库和决策支持系统(DSS),因为这些系统通常...
以上介绍了Oracle表分区的基本概念、优点、限制以及两种常见的分区类型——范围分区和列表分区,并给出了具体的创建示例。通过合理地使用表分区技术,可以有效地提高数据库系统的性能和可管理性。
"Oracle分区表和分区索引在VLDB中的研究" 本文研究了Oracle分区表和分区索引在VLDB(Very Large Databases)中的应用。分区表和分区索引是数据库管理中的关键技术之一,是VLDB中一个重要的性能提升机制。通过分析一...
### Oracle 分区表详解 #### 一、Oracle 分区简介 ...以上是 Oracle 分区表的基础概念及其操作的详细介绍。通过合理应用分区技术,不仅可以提高数据的可管理性,还能有效提升查询性能和系统可用性。