Eu tenho um SQL Server 2005 que se tornou imprevisível ultimamente e estou coçando a cabeça por que. As consultas executadas em segundos estão alterando os planos e demorando minutos (gastando o tempo na varredura completa da tabela ou no spool de índice). Agora, a primeira e mais óbvia é que as estatísticas estão obsoletas, causando confusão no otimizador, mas estou convencido de que esse não é o caso - primeiro porque os dados subjacentes não estão mudando significativamente (por exemplo, adicionando dados de um dia sobre os dados de um ano já em uma tabela) e, em segundo lugar, porque as Estatísticas de criação automática e Estatísticas de atualização automática são verdadeiras. No entanto, o otimizador está ficando confuso; executar o SQL no Tuning Advisor fornece várias CREATE STATISTICS
instruções de várias colunas que parecem corrigi-lo (até o próximo bit do SQL se comportar mal).
Alguma idéia de uma estratégia que eu possa usar para abordar isso que causa raiz? Por que as estatísticas "normais" não são suficientes?
fonte
where col=(cast @var...)
) e@var
podem ser'%'
. Eu o herdei há uma ou duas semanas e preciso mantê-lo funcionando basicamente até que seja substituído. Obrigado pelo link, eu vou dar uma olhada.SOS_SCHEDULER_YIELD
foiCXPACKET
esp_configure "max degree of parallelism", 1
parece ter - por enquanto - derrubado os dois problemas na cabeça. Obrigado!Do MSDN :
" Operações de inserção ocorrem em colunas-chave ascendentes ou descendentes As estatísticas em colunas-chave ascendentes ou descendentes, como IDENTITY ou colunas de carimbo de data / hora em tempo real, podem exigir atualizações de estatísticas mais frequentes do que o otimizador de consultas executa. As operações de inserção acrescentam novos valores às colunas ascendentes ou descendentes O número de linhas adicionadas pode ser muito pequeno para acionar uma atualização de estatísticas.Se as estatísticas não estiverem atualizadas e as consultas forem selecionadas das linhas adicionadas mais recentemente, as estatísticas atuais não terão estimativas de cardinalidade para esses novos valores. resultam em estimativas imprecisas de cardinalidade e desempenho lento da consulta.
Por exemplo, uma consulta que seleciona as datas mais recentes do pedido de vendas terá estimativas imprecisas de cardinalidade se as estatísticas não forem atualizadas para incluir estimativas de cardinalidade para as datas mais recentes do pedido de vendas.
Operações após a manutenção Considere atualizar as estatísticas após executar procedimentos de manutenção que alteram a distribuição dos dados, como truncar uma tabela ou executar uma inserção em massa de uma grande porcentagem das linhas. Isso pode evitar atrasos futuros no processamento de consultas enquanto as consultas aguardam atualizações automáticas de estatísticas ".
Você pode usar "EXEC sp_updatestats" de tempos em tempos em seu sistema (agendado algum tempo) ou usar a função STATS_DATE em todos os objetos e ver quando suas estatísticas foram atualizadas na última vez e se houve muito tempo desde então, use UPDATE ESTATÍSTICAS para esse objeto em particular. Na minha experiência, mesmo com as estatísticas automáticas ativadas, ainda somos obrigados a atualizar as estatísticas periodicamente, devido a operações de inserção que não acionam a atualização automática.
Para adicionar meu código pessoal (usado em um trabalho semanal que cria instruções dinâmicas para atualização de estatísticas):
Aqui eu recebo todos os objetos em que as estatísticas não foram atualizadas por mais de três meses ou, desde a última atualização, houve mais de 10% das linhas alteradas.
fonte
SOS_SCHEDULER_YIELD
mas não posso dizer agora se isso se deve aos planos ruins ou se essa caixa (6 anos, 2 processadores, 4G RAM) está realmente sobrecarregada agora e eu já foi sobre algum ponto de inflexão.Meu palpite é que uma ou mais de suas tabelas estão ficando grandes o suficiente para não atingir as 20% das alterações necessárias para ajudar a marcar essas estatísticas atuais como obsoletas, para que as Estatísticas de Atualização Automática entrem em ação e ainda assim haja atualizações suficientes (ou inserções) ) que ter estatísticas atualizadas ajudaria muito. Encontrei a mesma coisa recentemente em um ambiente específico após a atualização do SQL 2000 para o SQL 2008.
Além dos outros sites mencionados nas respostas acima, sugiro verificar os seguintes recursos online.
1) O Red-Gate tem vários e-books gratuitos disponíveis para download, incluindo "Estatísticas do SQL Server" de Holger Schmeling, onde você encontrará a seguinte citação:
http://www.red-gate.com/our-company/about/book-store/
"tabelas com mais de 500 linhas, pelo menos 20% dos dados de uma coluna tiveram que ser alteradas para invalidar as estatísticas vinculadas"
2) O SQL Sentry possui uma ferramenta gratuita do Plan Explorer que ajuda a rastrear problemas em um plano SQL, como uma estimativa de muitas ou poucas linhas em comparação com o número real de linhas para uma determinada tabela em uma consulta. Apenas salve o plano de execução real do SSMS e percorra as diferentes partes do plano usando o Plan Explorer. Não é que as informações não estejam disponíveis no SSMS usando o plano de execução gráfica, mas a ferramenta do SQL Sentry facilita muito a visualização.
http://www.sqlsentry.com/plan-explorer/sql-server-query-view.asp
3) Verifique você mesmo a data de atualização das estatísticas nas tabelas nas consultas que você mais deseja usar STATS_DATE (); você pode encontrar uma consulta rápida para obter as estatísticas mais antigas usando uma consulta encontrada na discussão a seguir.
http://blog.sqlauthority.com/2010/01/25/sql-server-find-statistics-update-date-update-statistics/
Eu espero que isso ajude!
Eu acho que você vai gostar especialmente do livro da Red-Gate!
-Jeff
fonte