分区索引(二)--本地分区索引

本地分区索引

       可以使用与表相同的分区键和范围界限来对本地索引分区。每个本地索引的分区只包含了它所关联的表分区的键和ROWID本地索引可以是B树或位图索引。如果是B树索引,它可以是唯一或不唯一的索引。

        这种类型的索引支持分区独立性,这就意味着对于单独的分区,可以进行增加、截取、删除、分割、脱机等处理,而不用同时删除或重建索引。Oracle自动维护这些本地索引本地索引分区还可以被单独重建,而其他分区不会受到影响。

 

1有前缀的索引

       有前缀的索引包含了来自分区键的键,并把它们作为索引的前导。例如,让我们再次回顾participant表。在创建该表后,使用survey_idsurvey_date这两个列进行范围分区,然后在survey_id列上建立一个有前缀的本地索引,如下图所示。这个索引的所有分区都被等价划分,就是说索引的分区都使用表的相同范围界限来创建。

 

       技巧本地的有前缀索引可以让Oracle快速剔除一些不必要的分区。也就是说没有包含WHERE条件子句中任何值的分区将不会被访问,这样也提高了语句的性能。

 

2无前缀的索引

       无前缀的索引并没有把分区键的前导列作为索引的前导列。若使用有同样分区键(survey_idsurvey_date)的相同分区表,建立在survey_date列上的索引就是一个本地的无前缀索引,如下图所示。可以在表的任一列上创建本地无前缀索引,但索引的每个分区只包含表的相应分区的键值。

 

       如果要把无前缀的索引设为唯一索引,这个索引就必须包含分区键的子集。在这个例子中,我们必须把包含survey ()survey_id 的列进行组合(只要survey_id不是索引的第一列,它就是一个有前缀的索引)

 

技巧:对于一个唯一的无前缀索引,它必须包含分区键的子集。

 

3)注意事项:

1)局部索引一定是分区索引,分区键等同于表的分区键。

2)前缀和非前缀索引都可以支持索引分区消除,前提是查询的条件中包含索引分区键。

3)局部索引只支持分区内的唯一性,无法支持表上的唯一性,因此如果要用局部索引去给表做唯一性约束,则约束中必须要包括分区键列。

4)局部分区索引是对单个分区的,每个分区索引只指向一个表分区;全局索引则不然,一个分区索引能指向n个表分区,同时,一个表分区,也可能指向n个索引分区,对分区表中的某个分区做truncate 或者moveshrink等,可能会影响到n个全局索引分区,正因为这点,局部分区索引具有更高的可用性。

5)位图索引必须是局部分区索引。

6)局部索引多应用于数据仓库环境中。

 

4示例

sql> create index ix_custaddr_local_id on custaddr(id) local;

索引已创建。

 

和下面SQL 效果相同,因为local索引就是分区索引:

create index ix_custaddr_local_id_p on custaddr(id)

local (   

  partition t_list556 tablespace icd_service,   

  partition p_other tablespace icd_service

)       

 

SQL> create index ix_custaddr_local_areacode on custaddr(areacode) local;

索引已创建。

 

验证2个索引的类型:

SQL>  select  index_name,table_name,partitioning_type,locality,ALIGNMENT  from

user_part_indexes where table_name='CUSTADDR';

 

index_name                                table_name partition locali alignment

------------------------------ ---------- --------- ------ ------------

ix_custaddr_local_areacode         custaddr      list            local    prefixed

ix_custaddr_local_id               custaddr      list            local    non_prefixed

 

  因为我们的custaddr 表是按areacode ix_custaddr_local_areacode 是有前缀的索引prefixed。而 ix_custaddr_local_id是非前缀索引。

你可能感兴趣的:(索引)