`
liwenshui322
  • 浏览: 513318 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Oracle 索引分区介绍

 
阅读更多

 

      一. 概述

      和表分区一样,索引也可以进行分区。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)上建立一个局部索引。因为我们很可能只要查找一个表分区或者几个表分区,而不是所有的表分区都要扫描。但是,如果我们要查找的是某某地区姓王的客户信息。这个明显要扫描所有表分区,那么要建立一个全局索引在地区字段和姓名字段上。

 

 

 

 

 

 

 

 

0
0
分享到:
评论

相关推荐

    oracle索引与分区索引介绍

    oracle索引与分区索引介绍 删除分区 分区合并(从中间删除掉一个分区,或者两个分区需要合并后减少分区数量) 创建新的分区 交换分区

    ORACLE_分区表_分区索引_索引分区

    ORACLE 分区表 分区索引 索引分区 实例讲解

    Oracle 分区表 分区索引 索引分区详解

    虽然存储介质和数据处理技术的发展也很快,但是仍然不能满足用户的需求,为了使用户的大量的数据在读写操作和查询中速度更快,Oracle提供了对表和索引进行分区的技术,以改善大型应用系统的性能。

    Oracle表分区和索引分区

    Oracle表分区和索引分区 分区概述 为了简化数据库大表的管理,例如在数据仓库中一般都是TB级的数量级.ORACLE8以后推出了分区选项.分区将表分离在若于不同的表空间上,用分而治之的方法来支撑元限膨胀的大表,组...

    oracle索引分区实践笔记

    oracle索引分区实践笔记,该笔记中详细描述Oracle的分区索引中的局部索引,全局索引使用中的区别,理解上的差异,执行中的不同,并附相关脚本

    ORACLE分区与索引

    对orcle大数据的查询的优化,ORACLE分区表、分区索引ORACLE对于分区表方式其实就是将表分段存储,一般普通表格是一个段存储,而分区表会分成多个段,所以查找数据过程都是先定位根据查询条件定位分区范围,即数据在...

    Oracle 分区表 分区索引

    如何创建,管理分区,分区索引。

    Oracle分区表及分区索引

    总结描述Oracle 11g分区表的种类及分区索引的类型。范围分区,列表分区,散列分区,组合分区,哈希分区,全局索引,分区索引

    oracle分区表分区索引.docx

    对于oracle分区表分区索引的详细说明。 详细描述了分区表的类型,分区索引的类型 分类 。 删除或truncate 表分区时,什么样的情况索引会失效 需要重建 ,什么时候 对索引 没影响 。

    分区索引,本地索引,全局索引的区别

    oracle 分区索引,本地索引,全局索引的区别

    oracle索引和表分区

    oracle索引和表分区,oracle索引,oracle表分区

    深入oracle分区索引的详解

    表可以按range、hash、list分区,表分区后,其上的索引和普通表上的索引有所不同,oracle对于分区表上的索引分为2类,即局部...5.前缀和非前缀索引都可以支持索引分区消除,前提是查询的条件中包含索引分区键。6.局部

    oracle分区与索引

    oracle分区与索引

    深入学习分区表及分区索引(详解oracle分区).docx

    深入学习分区表及分区索引(详解oracle分区).docx

    Oracle 分区索引介绍和实例演示

    分区索引(或索引分区)主要是针对分区表而言的。随着数据量的不断增长,普通的堆表需要转换到分区表,其索引呢,则对应的转换到分区索引。分区索引的好处是显而易见的。就是简单地把一个索引分成多个片断,在获取所需...

    全面学习分区表及分区索引-Oracle.pdf

    全面学习分区表及分区索引-Oracle.pdf

    ORACLE重建索引总结

    4、索引高度:索引高度是指由于数据行的插入操作而产生的索引层数,当表中添加大量数据时,oracle将生成索引的新层次以适应加入的数据行,因此,oracle索引可能有4层,但是这只会出现在索引数中产生大量插入操作的...

    深入学习分区表及分区索引(详解oracle分区.docx

    oracle数据库分区及索引的使用

    oracle索引使用样例

    个人整理的索引使用的样例 包含 索引并行创建 分区 监测 和索引统计信息

Global site tag (gtag.js) - Google Analytics