Eu tenho um armazém de dados de 200 GB no SQL Server.
Tenho experimentado tempos de execução muito lentos para algumas consultas; por exemplo, 12 horas para uma delete
consulta simples com um inner join
.
Depois de fazer algumas pesquisas com os planos de execução, atualizei as estatísticas das 2 tabelas envolvidas na consulta, usando a WITH FULLSCAN
opção
A consulta agora é executada em menos de um segundo, portanto, parece que as estatísticas não estavam atualizadas.
Estou pensando auto update statistics
em desativar o banco de dados e executar UPDATE STATISTICS
manualmente após o carregamento do armazém de dados. O data warehouse é carregado de forma incremental a partir de um sistema ERP de origem diariamente, à noite.
Estou correto ao assumir que, auto update statistics
em um cenário de data warehousing, não é realmente útil? Em vez disso, faz mais sentido atualizar as estatísticas manualmente após o carregamento dos dados?
Respostas:
Aqui está um whitepaper sobre quando ocorre a atualização automática de estatísticas . Aqui estão os pontos destacados em relação às atualizações automáticas das estatísticas:
Portanto, o @JNK destacou em um comentário que, se você tiver 1 bilhão de linhas em uma tabela, precisará ter 20.000.5000 gravações na primeira coluna da estatística para acionar uma atualização.
Vamos dar a seguinte estrutura:
Agora podemos verificar o que aconteceu nas estatísticas terrestres.
No entanto, para ver se este é um objeto estatístico significativo, precisamos:
Portanto, esta estatística não foi atualizada. Isso
SELECT
ocorre porque parece que a estatística não é atualizada até que ocorra uma e, mesmo assim, elaSELECT
precisa ficar fora do que o SQL Server possui dentro de seu histograma. Aqui está um script de teste que eu corri para testar isso:Em vez de desativar cegamente as estatísticas de auto_update, tentaria examinar seu conjunto de dados para distorção. Se os seus dados exibe distorção significativa, então você precisa considerar a criação de estatísticas filtradas e , em seguida, decidir se o gerenciamento de atualizações de estatísticas manualmente é o curso correto de ação.
Para analisar a inclinação, é necessário executar
DBCC SHOW_STATISTICS(<stat_object>, <index_name>);
(no script acima sem oWITH STAT_HEADER
) na combinação estatística / índice específica que você deseja examinar. Uma maneira rápida de ocular sua inclinação seria olhar o histograma (terceiro conjunto de resultados) e verificar a variação na suaEQ_ROWS
. Se for razoavelmente consistente, sua inclinação será mínima. Para intensificar, você olha aRANGE_ROWS
coluna e a variação lá, pois isso mede quantas linhas existem entre cada etapa. Por fim, você pode pegar o[All density]
resultado doDENSITY_VECTOR
(segundo conjunto de resultados) e multiplicá-lo pelo[Rows Sampled]
valor noSTAT_HEADER
(primeiro conjunto de resultados) e ver qual seria a expectativa média para uma consulta nessa coluna. Você compara essa média com a suaEQ_ROWS
e se houver muitos lugares onde isso varia significativamente, você terá uma inclinação.Se você achar que tem inclinação, precisará considerar a criação de algumas estatísticas filtradas nos intervalos que possuem alta muito alta,
RANGE_ROWS
para que você possa dar etapas adicionais para obter melhores estimativas desses valores.Depois de ter essas estatísticas filtradas em vigor, você poderá examinar a possibilidade de atualizar as estatísticas manualmente.
fonte