Olá pessoal!
Hoje vou falar um pouco sobre rebuild de índice no
Oracle.
No dia 04/04/2013 postei uma situação que eu tinha
vivido no trabalho. O nome do post foi: "Recuperar uma instância Oracleapós a exclusão acidental de um datafile".
Em uma passagem do que escrevi, cito um comando (ALTER TABLE OWNER.TBL_TABELA
MOVE TABLESPACE TBS50MB) que move uma tabela para outra tablespace (ou a mesma
tablespace), porém em contrapartida torna os índices da tabela em questão
"inutilizável", e é sobre isso que falarei agora!
Quando um índice está com status inutilizável
(UNUSABLE), ele necessita ser reparado antes que possa ser usado.
Diferentemente de um objeto PL/SQL por exemplo, pois quando é acessado a
primeira vez o objeto é recompilado automaticamente pelo Oracle.
Para identificar se um índice está inutilizável,
podemos usar a consulta abaixo:
SELECT owner, table_name, index_name
FROM dba_indexes
WHERE status = 'UNUSABLE';
Mas o que fazer para tornar o ínidice utilizável
novamente?
Bom pessoal...
A forma que vou usar para tornar um índice
novamente preparado para utilização, é muito importante também para
desfragmentar o índice (caso o mesmo esteja fragmentado).
O problema da fragmentação aparece quando
atualizamos ou apagamos (update/delete)
dados de uma tabela. Se os campos alterados possuem índices associados,
provavelmente o índice ficará fragmentado. Podemos dizer que a fragmentação é a
existência de espaços não utilizados (ou disponíveis) no meio de um espaço
utilizado. Isso porque os espaços que são liberados durante manipulação dos
dados (update/delete) não são imediatamente reutilizado, o que resulta em
“espaços livres" ou "blocos de dados espalhados nas tablespaces “.
Basicamente, a sintaxe que vou apresentar aqui é:
ALTER INDEX
owner.nome_do_indice REBUILD;
Mas vamos fazer com que esse script seja gerado
para todos os indices que estão inutilizáveis no banco.
SELECT ' alter index '
|| owner
|| '.'
|| index_name
|| ' rebuild; '
FROM dba_indexes
WHERE status = 'UNUSABLE';
A projeção dessa query pode ser usado para
reconstruir os índices, e pode também desfragmentar o índice. Não
necessariamente a desfragmentação do índice ocorrerá pois dependerá da
disponibilidade de espaço livre da tablespace.
Por hoje é só!
Espero ter contribuído e agregado algum
conhecimento a você leitor.
Fico grato por você ler meu post, e indico a
leitura dos demais artigos publicados.
Um grande abraço e até a próxima!
Muito interessante. Parabéns pela iniciativa.
ResponderExcluirAmigo, pode ser realizado esse procedimento com o Banco em funcionamento e sendo utilizado ? Senão, quais as consequências ? Obrigado !
ResponderExcluirBoa tarde,
ExcluirPode ser feito sim com o banco Online.
Fica atento à geração de archive. Caso queira reduzir a quantidade de archive gerado, utiliza o parâmetro "NOLOGGING".
Qualquer dúvida/sugestão, pode entrar em contato.
Obrigado pela visita!
Obrigado por compartilhar. Uso sistema Protheus da Totvs, e sempre dá problema nos índices. O suporte deles manda recriar a tabela, que é um processo trabalhoso e tem que tirar o sistema do ar. Com a utilização dos comandos apresentados, não terei mais este problema.
ResponderExcluirAbraço
Obrigado pelas palavras, amigo(a).
ExcluirFico muito feliz de ter contribuído!