oracle 分區索引

分區表創建後一般需要創建分區索引。分區索引分爲本地(local index)索引全局索引(global index)。

其中本地索引又可以分爲有前綴(prefix)的索引和無前綴(nonprefix)的索引。而全局索引目前只支持有前綴的索引。B樹索引和位圖索引都可以分區,但是HASH索引不可以被分區。位圖索引必須是本地索引。

下面我們就來一一介紹下:

一、local index:

       a.local index 結構:

       

       b.local index 特點:

       1.本地索引一定是分區索引,分區鍵等同於表的分區鍵,分區數等同於表的分區數,一句話,本地索引的分區機制和表的分區機制一樣。

       2.如果本地索引的索引列以分區鍵開頭,則稱爲前綴局部索引。

       3.如果本地索引的列不是以分區鍵開頭,或者不包含分區鍵列,則稱爲非前綴索引。

       4.前綴和非前綴索引都可以支持索引分區消除,前提是查詢的條件中包含索引分區鍵。

       5.本地索引只支持分區內的唯一性,無法支持表上的唯一性,因此如果要用本地索引去給表做唯一性約束,則約束中必須要包括分區鍵列。

       6.本地分區索引是對單個分區的,每個分區索引只指向一個表分區,全局索引則不然,一個分區索引能指向n個表分區,同時,一個表分區,也可能指向n個索引分區,對分區表中的某個分區做truncate或者move,shrink等,可能會影響到n個全局索引分區,正因爲這點,本地分區索引具有更高的可用性。

       7.位圖索引只能爲本地分區索引。

       8.本地索引多應用於數據倉庫環境中。

 

       創建語法:CREATE INDEX INX_TAB_PARTITION_COL1 ON TABLE_PARTITION(COL1) LOCAL;

       示例:

       create table test (id number,data varchar2(100))
       partition by RANGE (id)
       (
        partition p1 values less than (1000) tablespace p1,
        partition p2 values less than (2000) tablespace p2,
        partition p3 values less than (maxvalue) tablespace p3
       );
       create index i_id on test(id) local; 因爲id是分區鍵,所以這樣就創建了一個有前綴的本地索引。

       create index i_data on test(data) local;因爲data不是分區鍵,所以這樣就創建了一個無前綴的本地索引。

       本地索引:創建了一個分區表後,如果需要在表上面創建索引,並且索引的分區機制和表的分區機制一樣,那麼這樣的索引就叫做本地分區索引。本地索引是由ORACLE自動管理的,它分爲有前綴的本地索引和無前綴的本地索引。什麼叫有前綴的本地索引?有前綴的本地索引就是包含了分區鍵,並且將其作爲引導列的索引。什麼叫無前綴的本地索引?無前綴的本地索引就是沒有將分區鍵的前導列作爲索引的前導列的索引。

 

二、global index:

1. 全局索引的分區鍵和分區數和表的分區鍵和分區數可能都不相同,表和全局索引的分區機制不一樣。

2. 全局索引可以分區,也可以是不分區索引,全局索引必須是前綴索引,即全局索引的索引列必須是以索引分區鍵作爲其前幾列。

3. 全局索引可以依附於分區表;也可以依附於非分區表

4. 全局分區索引的索引條目可能指向若干個分區,因此,對於全局分區索引,即使只截斷一個分區中的數據,都需要rebulid若干個分區甚至是整個索引。

5. 全局索引多應用於oltp系統中

6. 全局分區索引只按範圍或者散列分區,hash分區是10g以後才支持

7. oracle9i以後對分區表做move或者truncate的時可以用update global indexes語句來同步更新全局分區索引,用消耗一定資源來換取高度的可用性。

8. 表用a列作分區,索引用b做局部分區索引,若where條件中用b來查詢,那麼oracle會掃描所有的表和索引的分區,成本會比分區更高,此時可以考慮用b做全局分區索引。

分區索引字典

DBA_PART_INDEXES 分區索引的概要統計信息,可以得知每個表上有哪些分區索引,分區索引的類型(local/global)

Dba_ind_partitions  每個分區索引的分區級統計信息

Dba_indexes/dba_part_indexes 可以得到每個表上有哪些非分區索引

索引重建

Alter index idx_name rebuild partition index_partition_name [online nologging]

需要對每個分區索引做rebuild,重建的時候可以選擇online(不會鎖定表),或者nologging建立索引的時候不生成日誌,加快速度。

Alter index rebuild idx_name [online nologging]

對非分區索引,只能整個index重建

 

分區索引示例:

--1、建分區表  
CREATE TABLE P_TAB(  
C1 INT,  
C2 VARCHAR2(16),  
C3 VARCHAR2(64),  
C4 INT ,  
CONSTRAINT PK_PT PRIMARY KEY (C1)  
)  
PARTITION BY RANGE(C1)(  
PARTITION P1 VALUES LESS THAN (10000000),  
PARTITION P2 VALUES LESS THAN (20000000),  
PARTITION P3 VALUES LESS THAN (30000000),  
PARTITION P4 VALUES LESS THAN (MAXVALUE)  
);  
--2、建全局分區索引  
CREATE INDEX IDX_PT_C4 ON P_TAB(C4) GLOBAL PARTITION BY RANGE(C4)  
(  
PARTITION IP1 VALUES LESS THAN(10000),  
PARTITION IP2 VALUES LESS THAN(20000),  
PARTITION IP3 VALUES LESS THAN(MAXVALUE)  
);  
--3、建本地分區索引  
CREATE INDEX IDX_PT_C2 ON P_TAB(C2) LOCAL (PARTITION P1,PARTITION P2,PARTITION P3,PARTITION P4);  
--4、建全局分區索引(與分區表分區規則相同的列上)  
CREATE INDEX IDX_PT_C1  
ON P_TAB(C1)  
GLOBAL PARTITION BY RANGE (C1)  
(  
PARTITION IP01 VALUES LESS THAN (10000000),  
PARTITION IP02 VALUES LESS THAN (20000000),  
PARTITION IP03 VALUES LESS THAN (30000000),  
PARTITION IP04 VALUES LESS THAN (MAXVALUE)  
);  
--5、分區索引數據字典查看  
SELECT * FROM USER_IND_PARTITIONS;  
SELECT * FROM USER_PART_INDEXES;  

 

對比索引方式

  一般使用LOCAL索引較爲方便,而且維護代價較低,並且LOCAL索引是在分區的基礎上去創建索引,類似於在一個子表內部去創建索引,這樣開銷主要是區分分區上,很規範的管理起來,在OLAP系統中應用很廣泛;而相對的GLOBAL索引是全局類型的索引,根據實際情況可以調整分區的類別,而並非按照分區結構一一定義,相對維護代價較高一些,在OLTP環境用得相對較多,這裏所謂OLTP和OLAP也是相對的,不是特殊的項目,沒有絕對的劃分概念,在應用過程中依據實際情況而定,來提高整體的運行性能。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章