我有一个分区表: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
:所以本地索引被截断和标记
valid
。除非您特别要求维护全局索引,否则它们将失效。(请参阅下文。)在您的情况下,您的主键似乎不是基于本地索引 - 实际上它似乎没有被分区,因为您无法
alter index ... rebuild
对分区索引执行操作,您需要重建每个分割。所以失效是预料之中的。为此,您可以在语句中添加
UPDATE INDEXES
/UPDATE GLOBAL INDEXES
子句,让 Oracle 在- 请参阅自动更新索引ALTER TABLE
期间自动为您维护索引。但是有一些限制,请仔细阅读自动更新索引时的注意事项部分。ALTER
但这并不总是可取的。有时在加载后重建索引效率更高。在这种情况下,您的加载过程通常可以使用该
SKIP_UNUSABLE_INDEXES
参数(可以在会话级别设置)。TRUE
(此参数在 11gR2 中 默认为。)