Index

截斷單個分區後,其主鍵索引變得不可用,並且對該分區的所有插入/更新都失敗

  • December 14, 2012

我有一個分區表:SAMPLE_PARTITIONED_TBL基於PERIOD_ID數字欄位(數據集:201001…201212.. 等等)有 60 個分區(沒有子分區)。該表有幾個本地索引,但出於某種原因,問題出在 PK 索引上。我在另一個模式中有相同的 DDL,它在那里工作正常。不知道 tio 尋找什麼來解決這個問題。

我正在使用 Informatica(ETL 工具)將數據載入到此表中。在載入之前,我們會截斷分區表:

SQL> ALTER TABLE owner_name.SAMPLE_PARTITIONED_TBL 
  2 TRUNCATE PARTITION SMPL_201001 DROP STORAGE;

隨著負載開始,我收到以下錯誤:

Message: Database errors occurred: 
ORA-01502: index 'owner_name.SAMPLE_PARTITIONED_TBL_PK' or 
partition of such index is in unusable state

查看索引的狀態…

SQL> select STATUS from all_indexes
 2  where INDEX_NAME like 'SAMPLE_PARTITIONED_TBL_PK';

STATUS
--------
UNUSABLE

現在在執行SQL> ALTER INDEX owner_name.SAMPLE_PARTITIONED_TBL_PK REBUILD;本地分區索引後返回STATUS=VALID狀態載入可以繼續沒有問題。


更新:

根據@Mat 在下面的觀察,我正在檢查 PK 索引是否在本地分區:

SQL> select * from all_indexes where table_name = 'SAMPLE_PARTITIONED_TBL';

我看到SAMPLE_PARTITIONED_TBL_PK和列表中的其他索引。

SQL> select * from  all_part_indexes where table_name = 'SAMPLE_PARTITIONED_TBL';

在這裡,我看到所有的索引LOCALITY='LOCAL'SAMPLE_PARTITIONED_TBL_PK結果集中缺少except ,從而證實了 Mat 的觀察。:)

謝謝。

可以預料,分區上的大多數 DDL 操作都會使受 DDL 影響的索引無效。ALTER TABLE文件在所有相關操作中都說明了這一點。

專門用於truncate partition

對於截斷的每個分區或子分區,Oracle 數據庫還會截斷相應的本地索引分區和子分區。如果這些索引分區或子分區被標記為 UNUSABLE,那麼數據庫將截斷它們並將 UNUSABLE 標記重置為 VALID。

所以本地索引被截斷和標記valid。除非您特別要求維護全域索引,否則它們將失效。(請參閱下文。)

在您的情況下,您的主鍵似乎不是基於本地索引 - 它實際上似乎沒有被分區,因為您無法alter index ... rebuild對分區索引執行操作,您需要重建每個劃分。所以失效是預料之中的。

為此,您可以在語句中添加UPDATE INDEXES/UPDATE GLOBAL INDEXES子句,讓 Oracle 在- 請參閱自動更新索引ALTER TABLE期間為您自動維護索引。但是有一些限制,請仔細閱讀自動更新索引時的注意事項部分。ALTER

但這並不總是可取的。有時在載入後重建索引效率更高。在這種情況下,您的載入過程通常可以使用該SKIP_UNUSABLE_INDEXES參數(可以在會話級別設置)。TRUE(此參數在 11gR2 中 預設為。)

引用自:https://dba.stackexchange.com/questions/30084