一. 概述
和表分割槽一樣,索引也可以進行分割槽。oracle中對索引進行分割槽有兩種方式:
1. 每乙個索引分割槽對應乙個表分割槽,而且只索引該錶分割槽。也就是有多少個表分割槽就有多少個索引分割槽。稱之為區域性分割槽索引。
2. 索引按照區間分割槽(或者雜湊分割槽),乙個索引可以指向任何表分割槽的資料。索引分割槽個數與表分割槽個數沒有關係,稱之為全域性分割槽索引。
二. 區域性索引
oracle中有兩類區域性索引:區域性字首索引和區域性非字首索引。看例子:
create table partitioned_table ( a int, b int, data char(20) )
partition by range (a)
( partition part_1 values less than(2) tablespace p1,
partition part_2 values less than(3) tablespace p2 )
如上語句建立了乙個表,分成了2個區。a小於2的放在part_1區,a大於2小於3的放在part_2區。接著我們建立兩個區域性索引:
create index local_prefixed on partitioned_table (a,b) local;
create index local_nonprefixed on partitioned_table (b) local;
往表裡面插入一些資料:
insert into partitioned_table select mod(rownum-1,2)+1, rownum, 'x' from all_objects;
將表空間p2離線,也就是part_2分割槽變成不可用:
alter tablespace p2 offline;
執行如下查詢:
select * from partitioned_table where a = 1 and b = 1;
能夠執行成功,使用的區域性字首索引,只查詢了part_1分割槽。
執行第二個查詢:
select * from partitioned_table where b = 1;
執行失敗,使用的區域性非字首索引,其實這裡與使用哪一種型別的區域性索引木有關係,b=1的資料不能確定都在part_1區,故part_2分割槽也需要查詢,由於part_2分割槽已經不可用,故查詢失敗。
將區域性字首索引刪除,繼續查詢如下:
drop index local_prefixed;
select * from partitioned_table where a = 1 and b = 1;
執行成功,這個時候只能使用區域性非字首索引,也只會掃瞄part_1分割槽,因為表分割槽已經定義了a小於2的值放在part_1分割槽。
因此,掃瞄哪些表分割槽,不掃瞄哪些表分割槽與使用什麼型別的區域性索引沒有關係,只與表分割槽機制相關。
那麼,什麼情況使用區域性字首索引,什麼情況使用區域性非字首索引呢?這個主要看你主要進行什麼樣的查詢。比如:你主要會進行如下查詢:select ... from partitioned_table where a = :a and b = :b; 那麼在(a,b)列上建立乙個區域性字首索引很合適。如果除開上面那個查詢很頻繁,下面這個查詢也很頻繁:select ... from partitioned_table where b = :b;那麼在(b,a)上建立乙個非字首索引很合適。
三. 全域性索引
與區域性索引不同,全域性索引只有一類,字首全域性索引。也就是全域性索引的索引鍵應該從索引的分割槽鍵開始,無論用什麼屬性對索引分割槽,這些屬性必須是索引鍵的前幾列。比如:
create table partitioned ( timestamp date, id int )
partition by range (timestamp)
( partition part_1 values less than ( to_date('01-jan-2000','dd-mon-yyyy') ) ,
partition part_2 values less than ( to_date('01-jan-2001','dd-mon-yyyy') ) )
建立分割槽表,以timestamp列分割槽,接著執行如下sql語句建立乙個全域性索引
create index partitioned_index on partitioned(id)
global
partition by range(id)
( partition part_1 values less than(1000),
partition part_2 values less than (maxvalue) )
這個全域性索引的索引鍵是id,索引的分割槽鍵是id。如果索引鍵指定為(timestamp,id)就會報錯。
那麼什麼情況下使用區域性索引,什麼情況使用全域性索引。這還是要看你需要查詢什麼樣的資料。假如乙個客戶資訊表,是按照客戶的註冊時間(regist_time)進行表分割槽的。如果我們要查詢註冊時間從date1到date2中姓王的所有客戶資訊,這個時候適合在客戶名稱(name)上建立乙個區域性索引。因為我們很可能只要查詢乙個表分割槽或者幾個表分割槽,而不是所有的表分割槽都要掃瞄。但是,如果我們要查詢的是某某地區姓王的客戶資訊。這個明顯要掃瞄所有表分割槽,那麼要建立乙個全域性索引在地區欄位和姓名欄位上。
Oracle索引分割槽介紹
和表分割槽一樣,索引也可以進行分割槽。oracle中對索引進行分割槽有兩種方式 每乙個索引分割槽對應乙個表分割槽,而且只索引該錶分割槽。也就是有多少個表分割槽就有多少個索引分割槽。稱之為區域性分割槽索引。索引按照區間分割槽 或者雜湊分割槽 乙個索引可以指向任何表分割槽的資料。索引分割槽個數與表分割槽...
Oracle分割槽索引
表可以按 range hash list 分割槽,表分割槽後,其上的索引和普通表上的索引有所不同,oracle 對於分割槽表上的索引分為 2類,即區域性索引和全域性索引,下面分別對這 2種索引的特點和侷限性做個總結。1.區域性索引一定是分割槽索引,分割槽鍵等同於表的分割槽鍵,分割槽數等同於表的分割槽...
oracle分割槽索引
前兩天做乙個大的分割槽表的資料清理,split 分割槽後,忘記rebuild 索引,導致生產庫查詢的分割槽表非常的緩慢 對分割槽表某個分割槽做split 如果沒有在alter table 語句最後加上update indexes,被 出的兩個分割槽的本地索引和整個表的全域性索引都會失效。當根據索引字...