一、分区表、索引的分类

1、分区表原理:
对于10gR2而言,ORACLE对于分区表方式其实就是将表分段存储,一般普通表格是一个段存储,而分区表会分成多个段,所以查找数据过程都是先定位根据查询条件定位分区范围,即数据在那个分区或那几个内部,然后在分区内部去查找数据,一个分区一 般保证四十多万条数据就比较正常了,
2、分区表的分类:

•    Range(范围)分区
range分区方式,也算是最常用的分区方式,其通过某字段或几个字段的组合的值,从小到大,按照指定的范围说明进行分区,我们在INSERT数据的时候就会存储到指定的分区中。

•    Hash(哈希)分区

Hash分区方式,它没有固定的规则,由ORACLE管理,只需要将值INSERT进去,ORACLE会自动去根据一套HASH算法去划分分区,只需要告诉ORACLE要分几个区即可。

•    List(列表)分区
List分区方式,一般是在range基础上做的二级分区较多,是一种列举方式进行分区,一般讲某些地区、状态或指定规则的编码等进行划分。

•    以及组合分区:Range-Hash,Range-List。

对于表而言(常规意义上的堆组织表),上述分区形式都可以应用(甚至可以对某个分区指定compress属性),只不过分区依赖列不能是lob,long之类数据类型,每个表的分区或子分区数的总数不能超过1023个。

3、索引:需要区分创建的是全局索引,或本地索引:
•   全局索引(global index):即可以分区,也可以不分区。即可以建range分区,也可以建hash分区,即可建于分区表,又可创建于非分区表上,就是说,全局索引是完全独立的,因此它也需要我们更多的维护操作。
•   本地索引(local index):其分区形式与表的分区完全相同,依赖列相同,存储属性也相同。对于本地索引,其索引分区的维护自动进行,就是说你add/drop/split/truncate表的分区时,本地索引会自动维护其索引分区。

具体的oracle创建分区表和索引见 oracle分区表和索引创建.

三、oracle分区索引失效

在这里插入图片描述
1、索引失效原因
出现这个问题,可能有人move过表,或者disable 过索引,或者这个原来不是分区表后面加的分区。

  1. alter table xxxxxx move tablespace xxxxxxx 命令后,索引就会失效。

  2. alter index index_name unusable,命令使索引失效。

2、索引失效处理方案

  1. 重建索引才是解决这类问题的完全的方法。

alter index index_name rebuild (online);

或者: alter index index_name rebuild;

  1. 如果是分区索引只需要重建那个失效的分区 。

alter index index_name rebuild partition partition_name (online);

3、alter index rebuild 和alter index rebuil online的区别

  1. 扫描方式不同

Rebuild以index fast full scan(or table full scan) 方式读取原索引中的数据来构建一个新的索引,有排序的操作;

rebuild online 执行表扫描获取数据,有排序的操作;

说明:Rebuild 方式 (index fast full scan or table full scan 取决于统计信息的cost)

  1. rebuild 会阻塞 dml 操作 ,rebuild online 不会阻塞 dml 操作

  2. rebuild online 时系统会产生一个 SYS_JOURNAL_xxx 的 IOT 类型的系统临时日志表 , 所有 rebuild online 时索引的变化都记录在这个表中 , 当新的索引创建完成后 , 把这个表的记录维护到新的索引中去 , 然后 drop 掉旧的索引 ,rebuild online 就完成了

注意点:

  1. 执行rebuild操作时,需要检查表空间是否足够
  2. 虽然说rebuild online操作允许dml操作,但是还是建议在业务不繁忙时间段进行rebuild操作会产生大量redo log
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐