索引相關知識回顧

dcswinner發表於2012-10-21

分割槽索引和全域性索引:
分割槽索引就是在所有每個區上單獨建立索引,它能自動維護,在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,oracle不支援在分割槽表上建立PK主鍵或時主鍵列不包含分割槽列,建立唯一約束也不可以這樣。 

全域性索引就是在全表上建立索引,它可以建立自己的分割槽,可以和分割槽表的分割槽不一樣,也就是它是獨立的索引。

在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);
或者把全域性索引分成多個區(注意和分割槽表的分割槽不一樣):
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

如果想在主鍵的列上建立分割槽索引,除非主鍵包括分割槽鍵,還有就是主鍵建在兩個或以上列上,否則不能建立。

在頻繁刪除表的分割槽且資料更新比較頻繁時為了維護方便要避免使用全域性索引。

索引監控:

另外,oracle表上的索引應該都是有用的索引,也就是都能被查詢所用。如果某個索引不能被查詢使用,則應該刪除它,oracle提供了一個很好的監控索引的方法:

啟用索引監控的方法如下:

alter index inx_org_id monitoring usage;

啟用監控後,我們可以檢視v$objec_usage檢視。該檢視裡記錄了那些啟用了監控的索引資訊,其中,index_name欄位說明被監控索引的名稱;used欄位說明在監控的時間段裡是否被使用過:select index_name,table_name,monitoring,used from v$object_usage;

INDEX_NAME       TABLE_NAME        MON         USE

-----------------------      ---------------------     ------------    ---------

INX_ORG_ID          RES_ORG             YES            NO

select count(*) from reg_org where org_id = 43000600;  

COUNT(*)

---------------

      0

select index_name,table_name,monitoring,used from v$object_usage;

INDEX_NAME       TABLE_NAME        MON         USE

-----------------------      ---------------------     ------------    ---------

INX_ORG_ID          RES_ORG             YES            YES

當我們發出一句where org_id=43000600的查詢語句後,該索引的used的值從NO變成YES了。因為org_id欄位上存在一個索引,並且被使用到了。

alter index idx_org_id nomonitoring usage;

 關閉索引監控。

索引以及表的分割槽的相關檢視,以及分割槽的匯入匯出:

匯出子分割槽: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

========================

查詢分割槽表:select * from hcl partition(p_200809)

匯出分割槽表:exp username/pwd file=/aa.dmp tables=(hcl:p_200809,hcl:p_200810);

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

相關文章