首页 > 数据库技术 > 详细

Oracle分区索引

时间:2017-01-09 00:35:18      阅读:229      评论:0      收藏:0      [点我收藏+]

概述

  索引就是通过事先排好序,从而在查找时可以应用二分查找等高效率的算法,索引也可以简单理解成字典的目录,通过目录定位到详细的内容页。分区索引一般用在分区表中,关联表中的某个或者某些字段,来提高表数据的查询效率。分区索引通过使用结构可以分为有前缀(prefix)的分区索引和无前缀(nonprefix)的分区索引。通过使用范围又可以分为分为本地(local index)索引和全局索引(global index)。局部索引比全局索引容易管理, 而全局索引比较快。

与索引信息有关的系统表:

    dba_part_indexes 分区索引的概要统计信息,可以得知每个表上有哪些分区索引,分区索引的类型(local/global)。

    dba_ind_partitions 每个分区索引的分区级统计信息,记录分区索引分区信息;

    dba_indexes 可以得到每个表上有哪些索引信息包括分区索引和非分区索引;

    Local索引肯定是分区索引,Global索引可以选择是否分区,如果分区,只能是有前缀的分区索引。

创建基本的分区表

create table T_TESTPDBA (id number, time date) 
partition by range (time) ( partition p1 values less than (to_date(
2017-01-1, yyyy-mm-dd)), partition p2 values less than (to_date(2018-01-1, yyyy-mm-dd)), partition p3 values less than (to_date(2019-01-1, yyyy-mm-dd)), partition p4 values less than (maxvalue) )

查询是否创建成功

---记录表分区信息
select
table_name,partition_name,tablespace_name from user_tab_partitions where table_name=T_TESTPDBA;
---记录表信息
select owner,table_name,tablespace_name,cluster_name from all_tables where table_name=T_TESTPDBA;

 

局部索引(Local Index)

  对于局部索引,oracle会自动维护分区索引的信息,局部索引默认是有前缀的分区索引;

创建局部索引

create index IX_TESTPDBA_ID on t_testpdba(id) local;

由于Oracle自动维护局部索引信息,所以上面语句和下面语句同等效果

create index IX_TESTPDBA_ID on T_TESTPDBA(id) local 
(
   partition p1,
   partition p2,
   partition p3,
   partition p4
);

查询索引信息

select t.owner,t.index_name,t.table_name,t.locality,t.alignment,t.table_name,t.index_name from dba_part_indexes  t where t.table_name=T_TESTPDBA;

查询索引分区详细

select * from dba_ind_partitions  t where t.index_name=IX_TESTPDBA_ID;

通过查询,可以看见系统维护了4个索引分区信息。由于Oracle自动维护局部索引分区信息,不论表分区发生CUD操作,Oracle都会自动维护

表分区删除,Oracle自动维护索引分区

alter table T_TESTPDBA drop partition p3;

表分区拆分,Oracle自动维护索引分区

ALTER TABLE T_TESTPDBA SPLIT PARTITION P4 AT(TO_DATE(2020-01-01,YYYY-MM-DD)) INTO (PARTITION P41,PARTITION P5); 

表分区合并,Oracle自动维护索引分区

ALTER TABLE T_TESTPDBA merge partitions P41,P5 into partition P4;

表分区表空间转移,Oracle自动维护索引分区

--移动分区到特定表空间
alter table T_TESTPDBA move partition p3 tablespace EINVOICEDATA;

全局索引(global index)

    Global索引可以选择是否分区,如果分区,只能是有前缀的分区索引。Oracle不自动维护表的索引信息;

有前缀(prefix)的分区索引和无前缀(nonprefix)的分区索引的区别

(1)有前缀的分区索引指包含了分区键,并且将其作为引导列的索引。

create index IX_TESTPDBA_ID_GLOBAL on t_Testpdba(time) global --time是引导列
partition by range(time)                      --time分区列
(
  partition p1 values less than(to_date(2019-01-1, yyyy-mm-dd)),
  partition p2 values less than(maxvalue)
);

(2)无前缀的分区索引的列不是以分区键开头,或者不包含分区键列。

create index IX_TESTPDBA_ID_GLOBAL on t_Testpdba(id) global  --id是索引列
partition by range(time)                      --time分区列
(
  partition p1 values less than(to_date(2019-01-1, yyyy-mm-dd)),
  partition p2 values less than(maxvalue)
);

     全局分区索引不支持非前缀的分区索引,如果创建,系统会提示GLOBAL 分区索引必须加上前缀

全局索引注意事项

(1)全局索引可以分区,也可以是不分区索引,全局索引必须是前缀索引,即全局索引的索引列必须是以索引分区键作为其前几列。

(2)全局索引可以依附于分区表;也可以依附于非分区表。

(3)全局分区索引的索引条目可能指向若干个分区,因此,对于全局分区索引,即使只截断一个分区中的数据,都需要rebulid若干个分区甚至是整个索引。

(4)全局分区索引只按范围或者散列分区。

(5) oracle9i以后对分区表做move或者truncate的时可以用update global indexes语句来同步更新全局分区索引,用消耗一定资源来换取高度的可用性。

(6) 表用a列作分区,索引用b做局部分区索引,若where条件中用b来查询,那么oracle会扫描所有的表和索引的分区,成本会比分区更高,此时可以考虑用b做全局分区索引。

全局索引重构

  Oracle 会自动维护分区索引,对于全局索引,如果在对分区表操作时,没有指定update index,则会导致全局索引失效,需要重建。对于分区索引,不能整体进行重建,只能对单个分区进行重建。

语法如下:

Alter index idx_name rebuild partition index_partition_name [online nologging]

语法说明:

  (1)online:表示重建的时候不会锁表。

  (2)nologging:表示建立索引的时候不生成日志,加快速度。

使用举例:

Alter index IX_TESTPDBA_ID_GLOBAL rebuild partition p3 online nologging;

 

Oracle分区索引

原文:http://www.cnblogs.com/xibei666/p/6263089.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!