Eu tenho um procedimento armazenado que trunca algumas tabelas com cerca de 1,75M de linhas em cada uma, antes de inserir novos dados (com base em dados de outras tabelas, cálculos etc.)
O esquema básico é muito simples:
- Truncar tabelas
- Insira 1,75 milhões de linhas em 'lotes' de cerca de 75.000 por vez.
Eu estou querendo saber se eu deveria reconstruir explicitamente os índices a qualquer momento neste processo? por exemplo
- Truncar tabelas
ALTER INDEX ALL ON xxx REBUILD WITH (FILLFACTOR=90)
[ou algo parecido]- Inserir 1,75 milhões de linhas
ou talvez
ALTER INDEX ALL ON xxx DISABLE
- Truncar tabelas
- Inserir 1,75 milhões de linhas
ALTER INDEX ALL ON xxx REBUILD WITH (FILLFACTOR=90)
[ou algo parecido]
Qualquer ajuda apreciada... não um DBA - um Dev que conhece muito bem o DB é mais preciso!
Tal como acontece com a maioria das perguntas deste tipo, depende. É improvável que você insira os dados na ordem "correta" para todos os índices envolvidos, o que significa que todos esses índices provavelmente encontrarão muitas divisões de página durante o processo de inserção. Então, vamos supor que você esteja inserindo na ordem do índice clusterizado. Você pode desabilitar todos os índices não clusterizados, truncar, fazer sua inserção e reconstruir todos os seus índices não clusterizados. É claro que tentar as duas abordagens lhe dirá a verdade sobre qual é mais rápida, independentemente da teoria por trás disso. :)
O Plano Básico com todos os índices habilitados pode ser lento e resultar em fragmentação.
ALTER INDEX REBUILD em uma tabela truncada e, portanto, vazia, não serve para nada, então você precisa alterar seu Plano A. Deve ser:
Ainda pode ser lento, mas pelo menos você obtém índices nítidos.
O plano B é bom. Teste todos os três e veja qual é mais rápido e qual fornece a menor fragmentação de índice. Em seguida, decida se a reconstrução vale a pena.