Oracle非分区索引,全局分区索引和本地分区索引。

Posted alex-zeng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle非分区索引,全局分区索引和本地分区索引。相关的知识,希望对你有一定的参考价值。

1.如果按照索引是否分区作为划分依据,Oracle 的索引类型可以分为非分区索引,全局分区索引和本地分区索引。

技术图片

2.创建演示实例

--创建非分区表
create
table test_partition_01( number_1 number, number_2 number, string_1 varchar2(10), string_2 varchar2(20) ); -- 写入数据 insert into test_partition_01(number_1, number_2, string_1, string_2) select dbms_random.random() as number_1, round(dbms_random.value(0, 100000)) as number_2, dbms_random.string(opt => A, len => 1) as String_1, dbms_random.string(opt => p, len => 10) as String_2 from dual connect by rownum < 100000; commit;
--试图创建本地分区索引 报错
CREATE INDEX ix_test_partition_01_1 ON test_partition_01(number_1) local (PARTITION p1, PARTITION p2, PARTITION p3);---ORA-14016 ---创建普通索引 CREATE INDEX ix_test_partition_01_1 ON test_partition_01(number_1); --创建 全局分区索引 CREATE INDEX ix_test_partition_01_2 ON test_partition_01(number_2) GLOBAL PARTITION BY RANGE (number_2) (PARTITION p1 VALUES LESS THAN (10000), PARTITION p2 VALUES LESS THAN (55000), PARTITION p3 VALUES LESS THAN (MAXVALUE)); 结论:非分区表可以创建普通索引和全局分区索引不能创建本地分区索引。 ------------------------------------------------------------------------------- create table test_partiton_02( number_1 number, number_2 number, string_1 varchar2(10), string_2 varchar2(20) ) partition by range(number_2) ( partition p1 values less than (10000), partition p2 values less than (20000), partition p3 values less than (50000), partition p4 values less than (70000), partition p5 values less than (maxvalue) );
--试图创建本地分区索引
CREATE INDEX ix_test_partiton_02_1 ON test_partiton_02(number_1) local (PARTITION p1, PARTITION p2, PARTITION p3);--ora-14024 索引的分区数必须等于基础表的分区数 --创建本地分区索引 CREATE INDEX ix_test_partiton_02_1 ON test_partiton_02(number_1) local (PARTITION p1, PARTITION p2, PARTITION p3, PARTITION p4, PARTITION p5 );--drop index ix_test_partiton_02_1; CREATE INDEX ix_test_partiton_02_1 ON test_partiton_02(number_1) local; --和上面的创建方式等效 --drop index ix_test_partiton_02_1; CREATE INDEX ix_test_partiton_02_1 ON test_partiton_02(number_1) ; --默认创建的是 非分区索引,分区索引才分 全局索引还是本地索引 ; ---创建全局分区索引 CREATE INDEX ix_test_partiton_02_2 ON test_partiton_02(number_2) GLOBAL PARTITION BY RANGE (number_2) (PARTITION p1 VALUES LESS THAN (10000), PARTITION p2 VALUES LESS THAN (55000), PARTITION p3 VALUES LESS THAN (MAXVALUE)); ---写入测试数据 insert into test_partiton_02(number_1, number_2, string_1, string_2) select dbms_random.random() as number_1, round(dbms_random.value(0, 100000)) as number_2, dbms_random.string(opt => A, len => 1) as String_1, dbms_random.string(opt => p, len => 10) as String_2 from dual connect by rownum < 100001; commit; --分析表 analyze table test_partiton_02 compute statistics; --查看 普通索引是否可用 select * from user_indexes t where t.INDEX_NAME in(IX_TEST_PARTITON_02_1,IX_TEST_PARTITON_02_2,IX_TEST_PARTITON_02_3); ---查看分区索引是否 可用 select * from user_ind_partitions t where t.INDEX_NAME in(IX_TEST_PARTITON_02_1,IX_TEST_PARTITON_02_2,IX_TEST_PARTITON_02_3); ---改变分区,查看普通索引和分区索引是否可用 -- 必须调整最后一个分区的大小,所以如果最后一个分区指定了最大值 必须先删除,再添加 alter table test_partiton_02 add partition p6 values less than (90000); alter table test_partiton_02 drop partition p5; --- 结论 改变分区 普通索引和全局分区索引都会失效 只有本地分区索引好使
PS:最好用以下语句查看索引的定义语句 select dbms_metadata.get_ddl(object_type => INDEX, name => IX_TEST_PARTITON_02_1) FROM DUAL; select dbms_metadata.get_ddl(object_type => INDEX, name => IX_TEST_PARTITON_02_2) FROM DUAL;
--- 发现了 plsql developer Version 11.0.5.1790 (64 bit) 的一个 bug 在用View 查看 DDL时 没有反应真实的情况

 

以上是关于Oracle非分区索引,全局分区索引和本地分区索引。的主要内容,如果未能解决你的问题,请参考以下文章

oracle 全局索引和局部索引的区别和作用

全局索引和本地索引的区别

oracle里,truncate一个分区,能不能保留全局索引

oracle 有全局索引怎么删除分区

全局(Global) 与本地(Local)索引的区别

Oracle-创建索引分区