1.如果按照索引是否分区作为划分依据,Oracle 的索引类型可以分为非分区索引,全局分区索引和本地分区索引。
2.案例一
--创建非分区表
create table text01 (num1 number, num2 number, str1 varchar2(10), str2 varchar2(20))tablespace yysms_cache ;
-- 写入数据
insert into text01 select dbms_random.random() as num1,--随机整数 round(dbms_random.value(0,1000))as num2, 1-1000的随机整数 dbms_random.string(opt => 'A', len => 1) as str1, 随机一位字符 dbms_random.string(opt => 'p', len => 10) as str2 随机10位字符 from dual connect by rownum<100;--循环插入 共插入99行数据 commit;
--试图创建本地分区索引 报错
create index ix_text01_par on text01(num1) local(partition p1, partition p2, partition p3);
--ORA-14016必须对 LOCAL 分区索引的基础表进行分区。该错误的原因是对非分区表新建索引时采用了LOCAL的参数
---创建普通索引
create index ix_text01_par on text01(num01);
--创建 全局分区索引
CREATE INDEX ix_test01_par ON test01(num2) GLOBAL PARTITION BY RANGE (num2) (PARTITION p1 VALUES LESS THAN (10000), PARTITION p2 VALUES LESS THAN (55000), PARTITION p3 VALUES LESS THAN (MAXVALUE));
结论:非分区表可以创建普通索引和全局分区索引不能创建本地分区索引。 -------------------------------------------------------------------------------
-------------------------------------------------------------------------------
3.案例二
--创建分区表
create table text02( num1 number, num2 number, str1 varchar2(10), str2 varchar2(20) ) partition by range(num2) ( 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_text02_par ON test_partiton_02(num) local (PARTITION p1, PARTITION p2, PARTITION p3, PARTITION p4, PARTITION p5 ); --索引的分区数必须等于基础表的分区数
--drop index ix_text02_par;
CREATE INDEX ix_text02_par ON text_partiton_02(num1) local;--和上面的创建方式等效
--drop index ix_text02_par; CREATE INDEX ix_text02_par ON text02(num1) ; --默认创建的是 非分区索引,分区索引才分 全局索引还是本地索引 ;
---创建全局分区索引
CREATE INDEX ix_text02_par ON text02(num2) GLOBAL PARTITION BY RANGE (num2) (PARTITION p1 VALUES LESS THAN (10000), PARTITION p2 VALUES LESS THAN (55000), PARTITION p3 VALUES LESS THAN (MAXVALUE));
-- 写入数据
insert into text02 select dbms_random.random() as num1,--随机整数 round(dbms_random.value(0,1000))as num2, 1-1000的随机整数 dbms_random.string(opt => 'A', len => 1) as str1, 随机一位字符 dbms_random.string(opt => 'p', len => 10) as str2 随机10位字符 from dual connect by rownum<100;--循环插入 共插入99行数据 commit;
4.分析表
analyze table text02 compute statistics;
--- 结论 改变分区 普通索引和全局分区索引都会失效 只有本地分区索引好使
5.最好用以下语句查看索引的定义语句
select dbms_metadata.get_ddl(object_type => 'INDEX', name => 'IX_TEXT02_PAR') FROM DUAL;