Atualizar estatísticas faz com que o farejamento de parâmetros.

Atualizar estatísticas faz com que o farejamento de parâmetros.

Atualizar estatísticas faz com que o farejamento de parâmetros. 1
cupom com desconto - o melhor site de cupom de desconto cupomcomdesconto.com.br


Na minha aula gratuita Como pensar como o mecanismo, explico que o SQL Server cria planos de execução com base em estatísticas. O conteúdo de suas tabelas informa as decisões tomadas sobre quais índices usar, se deve fazer buscas ou varreduras, quantos núcleos de CPU alocar, quanta memória conceder e muito mais.

Atualizar estatísticas faz com que o farejamento de parâmetros. 2

Estou cansado de cheirar seus planos.

Quando as estatísticas de um objeto são alteradas, o SQL Server diz para si mesmo: “Ei, na próxima vez em que uma consulta fizer referência a esse objeto, é melhor criar um novo plano de execução, porque meu antigo pode não ser um bom ajuste para o objeto. nova distribuição de dados “.

Isso geralmente é uma coisa boa: você deseja planos precisos.

No entanto, você também está se colocando em risco.

Sempre que você atualiza estatísticas em uma tabela ou índice, também informa ao SQL Server que todos os planos de execução que tocam nessa tabela devem ter um novo plano com base em quaisquer parâmetros que vêm a seguir. Como eu falo na minha aula de Fundamentos da detecção de parâmetros, isso significa que quanto mais você atualiza as estatísticas, mais chances você corre: você está liberando propositalmente partes do cache do plano, geralmente grandes, e apostando muito. próximos parâmetros que entram.

As estatísticas atualizadas podem criar melhores planos de consulta.

Atualizar estatísticas faz com que o farejamento de parâmetros. 3Em um mundo perfeito, você atualizar estatísticas nos casos em que os planos de consulta se beneficiariam de novas estatísticas.

Para entender o que quero dizer com isso, vamos olhar para a tabela Usuários no banco de dados Stack Overflow e pensar na frequência com que o conteúdo de cada coluna mudaria de uma maneira que afetaria nossos planos de consulta.

O cenário clássico em que atualizações frequentes de estatísticas são vitais é uma coluna de data que se concentra na atividade atual. Em um data warehouse, isso significa carregar novas vendas para ontem. Na coluna Estouro de pilha, o equivalente é a coluna LastAccessDate: os usuários efetuam logon o dia inteiro.

Leia Também  Aprenda a CLI da AWS - explore usuários, funções e políticas do IAM usando a AWS CLI

Digamos que tenhamos um índice no LastAccessDate e um procedimento armazenado que consulta as pessoas por intervalos dessa data:

Quando essa consulta é executada, o SQL Server precisa decidir se deve usar esse índice e quanta memória conceder para esse tipo em DisplayName. Se 1% de nossos usuários fizerem login hoje durante o dia, depois de atualizarmos as estatísticas da noite para o dia e tentarmos executar essa consulta de pesquisa:

Podemos não estimar com precisão o número de linhas que serão exibidas, pois os dados foram atualizados após a atualização das estatísticas. Essa subestimação pode significar que as classificações acabam se espalhando para o disco ou que escolhemos uma pesquisa de índice onde uma varredura de tabela seria mais apropriada:

Atualizar estatísticas faz com que o farejamento de parâmetros. 4

No plano acima, o SQL Server ineficientemente escolheu uma pesquisa de índice + chave e acabou lendo mais páginas do que as da tabela. Nesse cenário, você deseja atualizações freqüentes de estatísticas – e, em um site muito ativo, talvez você não consiga atualizar as estatísticas com rapidez suficiente para obter planos que refletem com precisão os dados que estarão na tabela ao longo do processo. próximas horas. É por isso que as pessoas acabam recorrendo a dicas de consulta, planos forçados e criando estatísticas falsas para dados futuros. (Eu nunca fiz esse último, mas acho fascinante.)

Leia Também  Como atualizar de uma instrução SELECT no SQL Server

Estatísticas frequentes atualizam o tiro pela culatra em outras colunas, no entanto.

Se eu escrever uma consulta que diz: “Mostre-me todos os usuários cuja Localização = San Diego, CA”, essa distribuição de dados não muda com tanta frequência. Claro, à medida que adicionamos progressivamente mais e mais usuários à tabela, temos uma pequena chance de que a estimativa seja reduzida em algumas ou algumas centenas de linhas – mas não é uma grande alteração na distribuição para ninguém. valor ao longo de várias semanas. Em um banco de dados maduro com anos de história, poderíamos deixar as mesmas estatísticas no local por meses seguidos, sem nos preocuparmos.

A distribuição de dados dentro da tabela não muda muito rapidamente.

Mas vaca sagrada, a distribuição de dados por consulta alterar constantemente.

Digamos que eu tenha um índice em Localização e um procedimento armazenado parecido com este:

Após uma atualização das estatísticas, o próximo local com o qual eu o determinarei determinará o desempenho de todos no dia:

  • Se um local grande como a Índia entra primeiro, todo mundo recebe uma varredura de tabela que fica paralela e recebe uma enorme concessão de memória
  • Se um local pequeno como San Diego entra primeiro, todo mundo recebe uma pesquisa de índice + pesquisa de chave que passa por um thread e recebe uma pequena concessão de memória

Portanto, o pior cenário para emergências de detecção de parâmetros seria reconstruir as estatísticas nesta tabela todos os dias. Todas as manhãs, você acorda e tropeça no trabalho com 50% de chance de varreduras de mesa e 50% de chance de tempdb cair. Todas as manhãs seria uma emergência diferente – mesmo que a distribuição de dados não esteja mudando.

Leia Também  Integração do Visual Studio Code (VS Code) com o Git Source Control

Os geeks do cache do plano podem identificá-lo olhando a coluna plan_generation_num em sys.dm_exec_query_stats. Cada vez que um plano é recompilado devido a alterações nas estatísticas, o plan_generation_num é incrementado. Números mais altos indicam compilações mais frequentes – mas, ao mesmo tempo, plan_generation_num = 1 não significa que você não também tem um problema de detecção de parâmetro. (Eu entendo isso em Mastering Parameter Sniffing.)

É por isso que atualizo as estatísticas semanalmente até ter um motivo para fazê-lo com mais frequência.

Eu me deparo com problemas de detecção de parâmetros com muito mais frequência do que com o problema do período de datas ascendentes. Prefiro as atualizações semanais seguras das estatísticas, o que leva a mais estabilidade do cache do plano e manhãs mais fáceis nos dias úteis.

Então, quando eu encontrar específico estatísticas desatualizadas em um ou dois dias, eu … não, ainda não atualizo as estatísticas diariamente. Apenas tento ajustar os índices e as consultas primeiro para facilitar o SQL Server a criar planos rápidos e eficientes.

Porque quando você recorre a atualizações diárias de estatísticas para corrigir consultas como esta:

Atualizar estatísticas faz com que o farejamento de parâmetros. 5Então você provavelmente esqueceu algo importante: esta consulta também é vulnerável à detecção de parâmetros!

Após o trabalho de estatísticas diárias, se alguém o chamar por um período de um ano (ou uma hora), você estará de volta à água quente com um plano de consulta que não funcionará bem para todos.

E é por isso que dou uma aula de 3 dias sobre Mastering Parameter Sniffing. Quando comecei a escrever, não tinha certeza de que poderia preencher três dias, mas quanto mais eu preparava e mais lia nossos parâmetros anteriores de sniffing posts, mais percebi que três dias talvez nem sequer fosse suficiente!

cupom com desconto - o melhor site de cupom de desconto cupomcomdesconto.com.br