ocp 模拟题疑问?

局部索引的分区键等同于表的分区键,局部索引的分区数等同于表的分区数,所以局部索引的分区机制和表的分区机制一样

局部索引在“索引键没有包含主表所有的分区键字段“的情况下,此时索引键值对应的索引数据在所有分区中都可能存在

这两句话不矛盾吗?局部索引的分区键等同于表的分区键了,为啥还能局部索引在“索引键没有包含主表所有的分区键字段“的情况下?

因为有二级分区的存在,可以在一个分区键上创建局部索引这样就是“索引键没有包含主表所有的分区键字段“的情况

楼上是一个好示例。
下面这种情况,局部索引在“索引键没有包含主表所有的分区键字段“的情况下,此时索引键值对应的索引数据在所有分区中都可能存在

obclient [USER_NONE]> create table t1(c1 number,c2 number,c3 number)partition by hash(c1) partitions 5;
Query OK, 0 rows affected (0.492 sec)

obclient [USER_NONE]> create index idx_t1 on t1(c2) local;
Query OK, 0 rows affected (1.663 sec)

image

1 个赞

前一句说的是局部索引的分区机制,后一句说的是局部索引分区时如果索引键不包含主表所有分区键的情况下可能存在重复数据从而无法使用索引提高查询效率

1、局部索引又名分区索引,创建索引的分区关键字是LOCAL,分区键等同于表的分区键,分区数等同于表的分区数,总之,局部索引的分区机制和表的分区机制一样
举例:
create table t1(a int primary key, b int) partition by hash(a) partitions 5;
create index idx on t1(b) local;

局部索引是针对单个分区上的数据创建的索引,因此局部索引的索引键值跟表中的数据是一一对应的关系,即局部索引上的一个分区一定对应到一个表分区,它们具有相同的分区规则,因此对于局部唯一索引而言,它只能保证分区内部的唯一性,而无法保证表数据的全局唯一性,如果要使用局部唯一索引去对数据唯一性做约束,那么局部唯一索引中必须包含表分区键。
2、@aibase举例一样 这个是图展示


这个会引发两个问题
问题一:由于本地索引只处理一个主表分区的数据 ,因此只能在一个主表分区内保证索引键的“唯一性约束”,无法在全表范围内保证索引键的唯一性约束
问题二:由于某一个索引键值在所有分区的本地索引上都可能存在,任何索引扫描必须在所有的分区上都做一遍,以免造成数据遗漏。

1 个赞