程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> ORA-01502oracle數據庫index索引的兩種形式

ORA-01502oracle數據庫index索引的兩種形式

編輯:Oracle教程

ORA-01502oracle數據庫index索引的兩種形式


目前的項目中,我們在跑批次的時候,有個SP總是報錯 “ORA-01502: index 'WBILL_102.PK_A_NOTWEB_ACT_PROVINCE_M' or partition of such index is in unusable state” ,解決辦法就是重建索引,ALTER INDEX IN_AA REBUILD;

但是解決完之後,在跑批還是報這個錯誤,這就讓我需要考慮,產生這個問題的原因是什麼!

我的錯誤場景還原:

有個表 CUS_ASSET_MONTH,主鍵是 PK_CUS_ASSET_MONTH ,主鍵字段是 CUS_CODE,這個表 是分區表 ,分區字段是 DATA_YM

為了使得我們的批次有重跑的功能,所以批次的第一步驟都是 將本月的數據刪除:

ALTER TABLE CUS_ASSET_MONTH TRUNCATE PARTITION PA_CUS_ASSET_MONTH_201412;

然後在往表 CUS_ASSET_MONTH 中 insert ,這個時候就會報錯 ORA-01502

場景還原完畢!

問題分析:

CUS_ASSET_MONTH 表的索引 PK_CUS_ASSET_MONTH 是全局索引,

這是創建索引的語句:

alter table CUS_ASSET_MONTH add constraint PK_CUS_ASSET_MONTH primary key (cus_code) using index ;

這樣創建的索引,默認是 GLOBAL INDEX

在對 表分區進行 TRUNCATE 操作之後,在進行 insert 就會報錯 ORA-01502 。

所以我們需要將 索引改成 LOCAL INDEX

alter table CUS_ASSET_MONTH add constraint PK_CUS_ASSET_MONTH primary key (cus_code) using index LOCAL ;

但是在執行這句話的時候,又報錯了:ORA-14039:分區列必須構成UNIQUE索引的關鍵字列子集

因為這是創建的是主鍵索引,主鍵索引的字段在分區表中必須要包含分區字段,如果這個主鍵索引必須要有,那麼可以將這個主鍵索引改成一個普通索引。

我的最終解決辦法[主鍵也有,普通索引也有]:

alter table CUS_ASSET_MONTH add constraint PK_CUS_ASSET_MONTH primary key (cus_code,data_ym) using index LOCAL ;

create index IN_CUS_ASSET_MONTH ON CUS_ASSET_MONTH(cus_code) local;

這樣我在對表分區進行 TRUNCATE 操作之後,在往這個表中插入數據的時候,就不會再報錯了!

PS 局部索引LOCAL INDEX 和 全局索引GLOBAL INDEX 的區別 :

局部索引local index

1. 局部索引一定是分區索引,分區鍵等同於表的分區鍵,分區數等同於表的分區說,一句話,局部索引的分區機制和表的分區機制一樣。
2. 如果局部索引的索引列以分區鍵開頭,則稱為前綴局部索引。
3. 如果局部索引的列不是以分區鍵開頭,或者不包含分區鍵列,則稱為非前綴索引。
4. 前綴和非前綴索引都可以支持索引分區消除,前提是查詢的條件中包含索引分區鍵。
5. 局部索引只支持分區內的唯一性,無法支持表上的唯一性,因此如果要用局部索引去給表做唯一性約束,則約束中必須要包括分區鍵列。
6. 局部分區索引是對單個分區的,每個分區索引只指向一個表分區,全局索引則不然,一個分區索引能指向n個表分區,同時,一個表分區,也可能指向n個索引分區,
對分區表中的某個分區做truncate或者move,shrink等,可能會影響到n個全局索引分區,正因為這點,局部分區索引具有更高的可用性。
7. 位圖索引只能為局部分區索引。
8. 局部索引多應用於數據倉庫環境中。

全局索引global index

1. 全局索引的分區鍵和分區數和表的分區鍵和分區數可能都不相同,表和全局索引的分區機制不一樣。
2. 全局索引可以分區,也可以是不分區索引,全局索引必須是前綴索引,即全局索引的索引列必須是以索引分區鍵作為其前幾列。
3. 全局分區索引的索引條目可能指向若干個分區,因此,對於全局分區索引,即使只動,截斷一個分區中的數據,都需要rebulid若干個分區甚
至是整個索引。
4. 全局索引多應用於oltp系統中。
5. 全局分區索引只按范圍或者散列hash分區,hash分區是10g以後才支持。
6. oracle9i以後對分區表做move或者truncate的時可以用update global indexes語句來同步更新全局分區索引,用消耗一定資源來換取高度的可用性。
7. 表用a列作分區,索引用b做局部分區索引,若where條件中用b來查詢,那麼oracle會掃描所有的表和索引的分區,成本會比分區更高,此時可以考慮用b做全局分區索引



分區索引字典

DBA_PART_INDEXES 分區索引的概要統計信息,可以得知每個表上有哪些分區索引,分區索引的類新(local/global,)
Dba_ind_partitions每個分區索引的分區級統計信息
Dba_indexesminusdba_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. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved