Estatísticas de atualização automática não atualizando estatísticas


8

Estou usando o SQL SERVER 2012meu Auto Update Stats ON no meu banco de dados.

No link abaixo, eu aprendi que, as estatísticas da Atualização Automática serão acionadas para cada SQRT(1000 * Table rows)alteração nas linhas da tabela. https://blogs.msdn.microsoft.com/srgolla/2012/09/04/sql-server-statistics-explained/

Criei uma tabela com 1000 registros

SELECT TOP 500 Row_number()OVER (ORDER BY (SELECT NULL)) rn,
                name
INTO   stst
FROM   sys.objects 

Criando estatísticas

CREATE STATISTICS rn  
    ON stst (rn)  

CREATE STATISTICS name  
    ON stst (name)  

Verificando as estatísticas criadas

DBCC show_statistics('stst', rn)  -- Rows 500 

DBCC show_statistics('stst', name) -- Rows 500

Conforme a fórmula

select SQRT(1000 * 500) -- 707.106781186548

Portanto, se eu adicionar / modificar 707.106781186548registros na minha tabela, as estatísticas de atualização automática devem ser acionadas

Adicione 1000mais registros à minha tabela que devem ser mais que suficientes para dispararauto update stats

INSERT INTO stst(rn,name)
SELECT TOP 1000 Row_number()OVER (ORDER BY (SELECT NULL)) rn,
                a.name
FROM   sys.objects a 

Para disparar o auto update stats

Select * from stst

Verificando as estatísticas

DBCC show_statistics('stst', rn)  -- Rows 500 

DBCC show_statistics('stst', name) -- Rows 500

Infelizmente ainda Rowsé o 500único.

Mesmo depois de inserir 1000registros na minha tabela, que é obviamente maior do que 707.106781186548durante a execução, SELECTpor que as estatísticas da Atualização Automática não foram acionadas? O que estou perdendo aqui


7
Você está perdendo algumas coisas. O cálculo aprimorado é usado apenas nas versões anteriores a 2016 se você tiver o Sinalizador de rastreamento 2371 ativado. As estatísticas não são atualizadas quando os dados são modificados, eles são atualizados após os dados serem modificados e uma consulta precisa usá-los (supondo que eles tenham atingido o limite de modificação).
Erik Darling

7
Além disso, uma consulta trivial (por exemplo, SELECT * sem uma cláusula WHERE) não acionará uma atualização de estatísticas. Tente executar uma consulta que realmente faça o mecanismo fazer algo em que as estatísticas possam ser úteis (por exemplo, Igualdade ou intervalo na coluna principal).
Aaron Bertrand

2
@sp_BlitzErik Obrigado pela informação sobre sinalizador de rastreamento nunca sabe que ..
P ரதீப்

3
Não se sinta estúpido, aprendi algo com as respostas à sua pergunta. E eu concordo que @sp_BlitzErik e / ou AaronBertrand devem postar suas respostas.
precisa saber é o seguinte

8
Vou deixar @AaronBertrand postar o dele como resposta. Ele poderia usar os pontos.
Erik Darling

Respostas:


11

O novo cálculo será usado apenas se o sinalizador de rastreamento 2371 estiver ativado, exceto no SQL Server 2016 quando o nível de compatibilidade do banco de dados de contexto estiver definido como 130, onde é o comportamento padrão. Consulte Microsoft KB 2754171:

Controlando o comportamento do Autostat (AUTO_UPDATE_STATISTICS) no SQL Server

As estatísticas não são atualizadas quando os dados são modificados. Uma atualização de estatísticas é acionada quando a otimização baseada em custos descobre que estatísticas interessantes para a consulta são obsoletas.

O otimizador não entra na otimização baseada em custos para consultas muito simples ("triviais"), onde um único plano óbvio é sempre ideal. Nenhuma atualização de estatísticas ocorre nesse cenário.

Consulte o Microsoft White Paper Planejar o cache e a recompilação no SQL Server 2012 por Greg Low.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.