Eu tenho uma tabela particionada: SAMPLE_PARTITIONED_TBL
com 60 partições (sem subparições) com base no PERIOD_ID
campo numérico (Conjunto de dados: 201001...201212.. e assim por diante). Esta tabela tem vários índices locais, mas o problema está no índice PK por algum motivo. Eu tenho o mesmo DDL em outro esquema e funciona bem lá. Não tenho certeza do que o tio procura para resolver isso.
Estou usando a Informatica (ferramenta ETL) para carregar dados nesta tabela. Antes de carregar, truncamos a tabela de partições:
SQL> ALTER TABLE owner_name.SAMPLE_PARTITIONED_TBL
2 TRUNCATE PARTITION SMPL_201001 DROP STORAGE;
Quando o carregamento começa, recebo o seguinte erro:
Message: Database errors occurred:
ORA-01502: index 'owner_name.SAMPLE_PARTITIONED_TBL_PK' or
partition of such index is in unusable state
Olhando para o status dos índices...
SQL> select STATUS from all_indexes
2 where INDEX_NAME like 'SAMPLE_PARTITIONED_TBL_PK';
STATUS
--------
UNUSABLE
Agora, depois de executar SQL> ALTER INDEX owner_name.SAMPLE_PARTITIONED_TBL_PK REBUILD;
o índice particionado local, retorna ao STATUS=VALID
estado que o carregamento pode continuar sem problemas.
ATUALIZAR:
De acordo com a observação de @Mat abaixo, estou verificando se o índice PK é particionado localmente:
SQL> select * from all_indexes where table_name = 'SAMPLE_PARTITIONED_TBL';
Eu vejo SAMPLE_PARTITIONED_TBL_PK
e os outros índices na lista.
SQL> select * from all_part_indexes where table_name = 'SAMPLE_PARTITIONED_TBL';
Aqui vejo todos os índices com LOCALITY='LOCAL'
; except SAMPLE_PARTITIONED_TBL_PK
está faltando no conjunto de resultados, confirmando assim a observação de Mat. :)
Obrigado.
Isso é esperado, a maioria das operações DDL em partições invalidará os índices afetados pelo DDL. Os documentos ALTER TABLE afirmam isso em todas as operações relevantes.
Especificamente para
truncate partition
:Portanto, os índices locais são truncados e marcados
valid
. Os índices globais são invalidados, a menos que você solicite especificamente que sejam mantidos. (Veja mais abaixo.)No seu caso, parece que sua chave primária não é baseada em um índice local - parece de fato não ser particionada, já que você não pode fazer um
alter index ... rebuild
em um índice particionado, você precisa reconstruir cada partição. Portanto, a invalidação é esperada.Para fazer isso, você pode adicionar uma cláusula
UPDATE INDEXES
/ à sua instrução para que o Oracle mantenha automaticamente os índices para você durante o - Consulte Atualizando Índices Automaticamente . Porém, existem algumas limitações, leia a seção Considerações ao atualizar índices automaticamente com atenção.UPDATE GLOBAL INDEXES
ALTER TABLE
ALTER
Mas isso nem sempre é desejável. Às vezes é mais eficiente reconstruir os índices após o carregamento. Nesse caso, seu processo de carregamento geralmente pode usar o
SKIP_UNUSABLE_INDEXES
parâmetro (pode ser definido no nível da sessão). (Este parâmetro é padronizadoTRUE
em 11gR2.)