O Oracle otimiza a criação de índices após o carregamento de dados em massa

1

Ao fazer carregamentos de dados em massa do data warehouse em uma tabela para a qual não exijo o registro em log, normalmente meu processo é:

  1. tabela truncada
  2. elimine índices
  3. insert / * + append * /
  4. crie novamente índices sem fazer log

Isso funciona bem, mas eliminar e recriar os índices pode causar problemas, por isso fiquei me perguntando se as pessoas acharam que essa etapa era necessária. Eu entendi que a partir de 10g, tal criação de índice foi otimizada para que os índices fossem reconstruídos seguindo a própria carga de dados.

Alguém tem alguma experiência com isso?

    
por Nick Pierpoint 03.06.2009 / 12:49

2 respostas

2

você diz que eliminar e recriar índices pode criar problemas. Outra maneira de fazer isso é marcar os índices inutilizáveis e reconstruí-los. Desta forma, a sua definição (nome, colunas, espaço de tabelas, etc.) nunca é "perdida", mesmo que alguma etapa falhe.

Portanto, na etapa 2, faça um loop sobre todos os índices da tabela e execute:

ALTER INDEX my_index_name UNUSABLE;

e na etapa 4, percorra os índices e reconstrua. Você pode especificar nologging, o nível paralelo desejado, compressão de índice, etc:

ALTER ÍNDICE my_index_name REBUILD NOLOGGING PARALLEL 16;

É mais eficiente construir índices em uma varredura limpa e depois "linha por linha". No primeiro caso, o Oracle faz uma varredura completa na tabela, classifica e grava o índice. Se o índice for mantido durante o carregamento em massa, ele será atualizado o tempo todo durante o carregamento, portanto, ele precisa atualizar constantemente seu bloco de folha em todo o lugar, realizando mais trabalho e E / S. Por quê? porque cada bloco de índice será atualizado várias vezes durante diferentes pontos no tempo da carga.

BTW - esperamos que você tenha um "step 5" - colete estatísticas sobre tabela e índices (em paralelo)

    
por 05.06.2009 / 22:40
0

Fazemos quase da mesma maneira, exceto que carregamos em massa para as tabelas temporárias e, em seguida, transferimos para a tabela real. Eu acho que criar índices após o carregamento de dados é uma etapa ETL bastante normal e não deve causar nenhum problema. Demora algum tempo, mas sem índices vai muito mais lento. Nunca nos deparamos com nenhum problema ao criar índices em tabelas já preenchidas.

    
por 04.06.2009 / 12:34