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;