Configuração
Em um datawarehouse, estou juntando uma tabela de fatos a 20 dimensões. A tabela de fatos possui 32 milhões de linhas e 30 colunas. Esta é uma tabela temporária, portanto não preciso lidar com outros usuários que leem ou escrevem na tabela. Seleciono 10 colunas da tabela base e 20 colunas das respectivas dimensões. As tabelas de dimensões são pequenas (entre 3 e 15.000 linhas). Os campos nos quais são unidos são números inteiros e nvarchars. Eu uso uma instrução SELECT ... INTO. Não há índices nas tabelas.
A velocidade de execução desta consulta é muito lenta para ser útil.
Soluções experimentadas
Como a consulta leva muito tempo para ser processada, tentei as seguintes soluções:
- Divida as 20 junções em 4 junções em 5 tabelas. O desempenho da consulta permanece baixo, no entanto.
- Coloque índices nas colunas de chave estrangeira. Nenhuma redução significativa de tempo.
- Verifique se os campos da condição de junção são inteiros. Percebi um aumento de desempenho de 25%. Não é exatamente o que estou procurando.
- Use uma inserção na instrução em vez de selecionar em. Desempenho pior devido ao crescimento do arquivo de log, embora o banco de dados esteja no modo de recuperação simples.
Essas descobertas levaram-me a incluir o plano de execução real, que mostra que 89% do custo está na inserção da tabela . Os outros custos são 8% de varredura da tabela na tabela de fatos e 2% na correspondência de hash para as junções internas.
Questões
- Quais são os possíveis motivos da inserção lenta da tabela?
- Quais são as maneiras de identificar esse gargalo sem o plano de execução?
- Quais ações posso tomar para reduzir o custo da inserção da tabela?