分区索引和全局索引
1.问题背景:
因业务需要,对分区表定时进行操作,包括但不限于新增删除分区,大量修改数据,相对应的分区表的索引也会受到影响,所以今天对分区索引和全局索引进行讨论记录。
2.存在问题:
若对分区表分区进行ddl操作,如进行删除分区,将会影响全局索引,使全局索引发生失效情况。而如果存在跨分区查询的情况,需要对各个分区进行事务一致性的维护,则必须要在分区ddl操作后,进行全局索引的重建,以保证全局索引的有效性。而本地索引则不会受到影响。
3.定义分析:
全局索引的创建,需要和分区表的分区键值相同并显式指定maxvalue值
create index &索引名称 on &分区表(&分区键值)
global partition by range (&分区键值)
(partition &分区1 values less than (TO_DATE('01-04-2022','DD-MM-YYYY')),
partition &分区2 values less than (TO_DATE('01-07-2022','DD-MM-YYYY')),
partition &分区3 values less than (TO_DATE('01-10-2022','DD-MM-YYYY')),
partition &分区4 values less than (maxvalue)
)
;
否则会出现错误
RROR at line 3:
ORA-14038: GLOBAL partitioned index must be prefixed
而在表分区进行分区的添加操作时,全局索引则不会自动添加该分区,需要手动将该分区进行添加
select INDEX_NAME, PARTITION_NAME from dba_ind_partitions where index_name=upper('&index_name');
alter table orders add partition &分区名称 values less than (&分区值);
select INDEX_NAME, PARTITION_NAME from dba_ind_partitions where index_name=upper('&index_name');
相对应的本地索引的创建,则可以与分区键值不相同,而且在分区的添加情况下,也会自动在本地索引中添加分区,删除分区时,也会自动删除相应的本地索引,本地索引分区与表分区是一一对应,每个分区都会独立创建索引分区。
select INDEX_NAME, PARTITION_NAME from dba_ind_partitions where index_name=upper('&索引名称');
alter table orders add partition &分区名称 values less than (&分区值);
select INDEX_NAME, PARTITION_NAME from dba_ind_partitions where index_name=upper('&索引名称');