Oracle如何在分区表上创建索引

通过上一章的Oracle分区的详解,我们知道了Oracle分区的优势以及如何进行创建。在实际生产环境中,为了进一步的优化大型表(大数据量集)的查询效率,这个时候得考虑在分区表上某个字段创建索引。分区表的索引和普通表的索引本质上是一样的,都是利用空间换取时间的方式,通过存储索引块来增加查询效率。但是有不同地方是,Oracle分区表索引可以分为局部(分区)索引和全局索引之分。


分区索引

所为的分区索引指的是在子分区当中按照某个字段建立索引,例如,上一章创建的学生成绩表中(score),可以对学生学号创建local索引,即分区索引。代码如下:

create index idx_score_stuid on student.score(stuid)
local
(
partition idx_score_stuid_1 tablespace TS_2018,
partition idx_score_stuid_2 tablespace TS_2019,
partition idx_score_stuid_3 tablespace TS_2020
)

请注意local关键字。在这个create index命令中没有指定范围,而是由local 关键字告诉Oracle为score表的每一个分区创建一个单独的索引,因此,每一个表分区对应着一个索引分区。每一个索引分区存储在不同的表空间上,可以大大提高I/O和查询效率。

通过查询数据字典dba_ind_partitions可以查看刚刚创建的分区索引,如下图:

oracle 分区索引


全局索引

Oracle分区表也可以创建全局索引,全局索引和普通表的索引一样,是对整表的数据进行创建索引。例如,可以对学生成绩表的(score)的课程ID(COURSEID)创建全局索引,具体代码如下:

create index STUDENT.IDX_SCORE_COURSEID 
on STUDENT.SCORE (courseid)
global;

这里,虽然分区索引比全局索引更容易管理,而且在分区当中查询效率更高,但是全局索引在全表进行唯一性检索时的速度可能会比局部索引更快,因为全局检索唯一性时,需要跨区。

注意:不能为子分区创建全局索引。