Temos um processo ETL noturno que envolve dados de várias fontes diferentes sendo nivelados e carregados em uma tabela completamente desnormalizada no SQL Server 2008 para geração de relatórios. O índice clusterizado na tabela consiste em uma chave composta de quatro colunas.
Devido à origem dos dados, não há realmente nenhuma maneira de carregar os dados na mesma ordem do índice clusterizado. Manter o índice ativo durante o carregamento ou descartá-lo/reconstruí-lo após o carregamento leva mais tempo do que o próprio carregamento sem um índice. Por outro lado, nenhum cluster com índices não clusterizados adequados ainda pode resultar em algumas consultas de relatórios que levam horas para serem processadas.
As únicas coisas em que consigo pensar para acelerar isso seriam particionar e colocar mais hardware no problema. Estou perdendo alguma coisa que ajudaria?
Existem algumas maneiras de contornar esse problema:
Como você mencionou, o particionamento ajudará. Se você particionar na coluna inicial do índice e garantir que todas as partições tenham o mesmo tamanho, poderá obter uma superescala. No entanto, o total de CPU necessário para criar o índice não será muito menor se você particionar. Mas economizará memória (se você tiver um sistema de E/S lento, isso pode ser útil)
Se esta for uma tabela de fatos de data warehouse tradicional, talvez seja melhor usar um índice columnstore
Em vez de fazer um mega
update
- que é lento. Considere este padrão:Desta forma, você pode manter o benefício da tabela antiga sendo ordenada e evitar reclassificar todas as linhas (somente as que foram alteradas).