关于本地分区索引和索引组织表保证唯一性的限制
首先说明索引组织表和本地分区唯一索引有着共同的特点。
1、索引组织表(以下简称IOT)要求主键是必须的因为表的结构会按照主键索引进行构造,如果IOT分区那么,那么可以理解为一个类似的按照某个字段分区的
本地索引,因为索引和表是在一起的,表的分区必然就是索引的分。而这个分区字段必须要是主键的一部分。考虑一个主键(name,time),如果分区键
为TIME,如果范围是10-16 00:00:00到10-17 00:00:00 如果我们能够保证在这个范围内name time的唯一那么在整个主键内必然唯一。如果我们使用其他
字段比如一个额外的ID字段分区,那么要保证主键的name time的唯一性只能全部扫描整个分区,这样分区的剪裁的特性就消耗殆尽了。
2、一样的本地分区索引来保证唯一性也是这样的,他必须包含分区键,这样才能做到在分区内唯一则唯一。
那么我们大概用语言描述一下:
如果IOT表分区 -> 那么分区键必须是主键的一部分
如果本地分区索引唯一 -> 那么其索引字段必须包含分区键
考虑如下几个报错
ORA-14039: partitioning columns must form a subset of key columns of a UNIQUE index
ORA-14188: sub-partitioning columns must form a subset of key columns of a UNIQUE index
这两个报错则是由于本地唯一索引不包含分区键或者子分区键的报错。
如下:
SQL> create unique index t12_u on t12(name) local;
create unique index t12_u on t12(name) local
ORA-14039: partitioning columns must form a subset of key columns of a UNIQUE index
SQL> create unique index t12_u on t12(name,c_time) local;
create unique index t12_u on t12(name,c_time) local
ORA-14188: sub-partitioning columns must form a subset of key columns of a UNIQUE index
ORA-25199: partitioning key of a index-organized table must be a subset of the primary key
这个报错则是说明IOT的分区表,分区键必须是其组织主键的一部分。
如下:
CREATE TABLE t12(c_time date,id int,name varchar2(20),primary key(name))
ORGANIZATION INDEX
PARTITION BY RANGE(c_time)
(
PARTITION p1 VALUES LESS THAN (TO_DATE('01-06-2012','dd-MM-yyyy')),
PARTITION p2 VALUES LESS THAN (TO_DATE('01-07-2015','dd-MM-yyyy')),
PARTITION p3 VALUES LESS THAN (TO_DATE('01-08-2017','dd-MM-yyyy')),
PARTITION p4 VALUES LESS THAN (TO_DATE('01-09-2019','dd-MM-yyyy'))
)
ORA-25199: partitioning key of a index-organized table must be a subset of the primary key
最后索引组织表不能包含子分区
ORA-25198: only range, list, and hash partitioning are supported for index-organized table
如下:
CREATE TABLE t12(c_time date,id int,name varchar2(20),primary key(name))
ORGANIZATION INDEX
PARTITION BY RANGE(c_time)
SUBPARTITION BY hash(id)
SUBPARTITION TEMPLATE
( SUBPARTITION h_p1,
SUBPARTITION h_p2,
SUBPARTITION h_p3,
SUBPARTITION h_p4
)
(
PARTITION p1 VALUES LESS THAN (TO_DATE('01-06-2012','dd-MM-yyyy')),
PARTITION p2 VALUES LESS THAN (TO_DATE('01-07-2015','dd-MM-yyyy')),
PARTITION p3 VALUES LESS THAN (TO_DATE('01-08-2017','dd-MM-yyyy')),
PARTITION p4 VALUES LESS THAN (TO_DATE('01-09-2019','dd-MM-yyyy'))
)
ORA-25198: only range, list, and hash partitioning are supported for index-organized table