oracle分割槽索引(一)

Nalternative發表於2011-02-14

       對索引的分割槽有兩種方法:
       區域性分割槽索引:locally partitioned index 每個表分割槽都有一個索引分割槽,而且只索引該表分割槽。
                                   區域性分割槽索引分為兩類:區域性字首索引,分割槽鍵在定義的前幾列上。使用區域性字首索引的查詢總允許索引分割槽消除,而使用區域性非字首索引的查詢可能不允許。
                                                                              區域性非字首索引
       全域性分割槽索引:globally  partitioned index 一個索引分割槽可能指向任何表分割槽。實際上索引分割槽數可能不等於表分割槽數。

        由於全域性索引只按區間或者雜湊分割槽,如果希望有一個組合或者列表分割槽索引,就必須使用區域性索引。區域性索引會使用與底層表相同的機制分割槽。


消除分割槽測試程式碼:
如果有多個列的查詢,比如 (a,b),a那麼可以建一個(基於a分割槽)非字首索引(a,b)
                                                
 
       select *from all_objects where object_name like '%PARTITIONED_TABLE%'
/
CREATE TABLE partitioned_table
( a int,
  b int,
  data char(20)
)
PARTITION BY RANGE (a)
(
PARTITION part_1 VALUES LESS THAN(2) tablespace mytest1,
PARTITION part_2 VALUES LESS THAN(3) tablespace mytest2
)
/
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;
begin
   dbms_stats.gather_table_stats
   ( user,
    'PARTITIONED_TABLE',
     cascade=>TRUE );
end;
/
alter tablespace mytest2 offline;
select * from partitioned_table where a = 1 and b = 1;
delete from plan_table;
explain plan for
select * from partitioned_table where a = 1 and b = 1;
select * from table(dbms_xplan.display);
select * from partitioned_table where b = 1;
delete from plan_table;
explain plan for
select * from partitioned_table where b = 1;
select * from table(dbms_xplan.display);
drop index local_prefixed;
select * from partitioned_table where a = 1 and b = 1;
delete from plan_table;
explain plan for
select * from partitioned_table where a = 1 and b = 1;
select * from table(dbms_xplan.display);


為了保證唯一性(包括unique約束和primary key約束),如果想使用一個區域性索引來保證這個約束,那麼分割槽鍵必須包括在約束本身中。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25323853/viewspace-687187/,如需轉載,請註明出處,否則將追究法律責任。

相關文章