分區索引就是在所有每個區上單獨建立索引,它能自動維護,在drop或truncate某個分區時不影響該索引的其他分區索引的使用,也就是索引不會失效,維護起來比較方便,但是在查詢效能稍微有點影響。
建立分區索引:
create index idx_ta_c2 on ta(c2) local (partition p1,partition p2,partition p3,partition p4);
或者 create index idx_ta_c2 on ta(c2) local ;
另外在create unique index idx_ta_c2 on ta(c2) local ;系統會報ORA-14039錯誤,這是因為ta表的分區列是c1,不支援在分區表上建立PK主鍵或主鍵列不包含分區列,建立唯一約束也不可以這樣。
分區索引只支援分區內的唯一性,無法支援表上的唯一性,因此如果要用局部索引去給表做唯一性限制式,則約束中必須要包括分區鍵列
ALTER TABLE TEST ADD CONSTRAINT PK_TEST PRIMARY KEY (SEQ_ID,PARTITION_ID) USING INDEX LOCAL;
全域索引就是在全表上建立索引,它可以建立自己的分區,可以和分區表的分區不一樣,也就是它是獨立的索引。
建立全域索引:
create index idx_ta_c3 on ta(c3) global;
在drop或truncate某個分區時需要建立索引alter index idx_xx rebuild,也可以通過alter table table_name drop partition partition_name update global indexes;實現,但是如果資料量很大則要花很長時間在重建索引上。
可以通過查詢user_indexes、user_part_indexes和user_ind_partitions視圖來查看索引是否有效。
create index idx_ta_c3 on ta(c3);
更多精彩內容:http://www.bianceng.cn/database/Oracle/
或者把全域索引分成多個區(注意和分區表的分區不一樣):
create index idx_ta_c4 on ta(c4) global partition by range(c4)(partition ip1 values less than(10000),partition ip2 values less than(20000),partition ip3 values less than(maxvalue));
注意全域索引上的引導列要和range後列一致,否則會有ORA-14038錯誤。如不能這樣寫:create index idx_ta_c4 on ta(c1) global partition by range(c4)(partition ip1 values less than(10000),partition ip2 values less than(20000),partition ip3 values less than(maxvalue));
oracle會對主鍵自動建立全域索引
如果想使某個分區索引置為不可用則可以用如下指令碼:
alter index idx_tab1 modify partition "ind partition name" unusable
如果想在主鍵的列上建立分區索引,除非主鍵包括分區鍵,還有就是主鍵建在兩個或以上列上,否則不能建立。
在頻繁刪除表的分區且資料更新比較頻繁時為了維護方便要避免使用全域索引。
匯出子分區:exp test1/test1 tables=ta:p1 file=part_1.dmp
分區用到的視圖:
user_tab_partitions,
user_part_indexes,
user_part_tables,
user_partial_drop_tabs,
user_part_indexes
user_part_key_columns
本文出自 “richard的筆記-積微成著” 部落格,請務必保留此出處http://zxf261.blog.51cto.com/701797/886336