Informações
Minha pergunta está relacionada a uma tabela moderadamente grande (~ 40 GB de espaço de dados) que é um heap
(infelizmente, não tenho permissão para adicionar um índice clusterizado à tabela pelos proprietários do aplicativo)
Uma estatística criada automaticamente em uma coluna Identidade ( ID
) foi criada, mas está vazia.
- As estatísticas de criação automática e as estatísticas de atualização automática estão ativadas
- Modificações aconteceram na tabela
- Existem outras estatísticas (criadas automaticamente) que estão sendo atualizadas
- Há outra estatística na mesma coluna criada por um índice (duplicado)
- Compilação: 12.0.5546
A estatística duplicada está sendo atualizada:
A pergunta real
No meu entendimento, todas as estatísticas podem ser usadas e as modificações são rastreadas, mesmo se houver duas estatísticas exatamente nas mesmas colunas (duplicadas), então por que essa estatística permanece vazia?
Informações de estatísticas
Informações estatísticas do banco de dados
Tamanho da tabela
Coluna Informações em que a estatística é criada
[ID] [int] IDENTITY(1,1) NOT NULL
Coluna de identidade
select * from sys.stats
where name like '%_WA_Sys_0000000A_6B7099F3%';
Obtendo algumas informações sobre outra estatística
select * From sys.dm_db_stats_properties (1802541555, 3)
Em comparação com minha estatística vazia:
Estatísticas + Histograma de "gerar scripts":
/****** Object: Statistic [_WA_Sys_0000000A_6B7099F3] Script Date: 2/1/2019 10:18:19 AM ******/
CREATE STATISTICS [_WA_Sys_0000000A_6B7099F3] ON [dbo].[table]([ID]) WITH STATS_STREAM = 0x01000000010000000000000000000000EC03686B0000000040000000000000000000000000000000380348063800000004000A00000000000000000000000000
Ao criar uma cópia das estatísticas, nenhum dado está dentro
CREATE STATISTICS [_WA_Sys_0000000A_6B7099F3_TEST] ON [dbo].[table]([ID]) WITH STATS_STREAM = 0x01000000010000000000000000000000EC03686B0000000040000000000000000000000000000000380348063800000004000A00000000000000000000000000
Ao atualizar manualmente as estatísticas, elas são atualizadas.
UPDATE STATISTICS [dbo].[Table]([_WA_Sys_0000000A_6B7099F3_TEST])
Consegui reproduzir isso, tanto com uma estatística vazia quanto com uma estatística preenchida. Eu providenciei para que uma estatística automática fosse criada em uma tabela vazia, e o índice foi criado posteriormente:
Descobri que as modificações continuam a ser rastreadas com precisão em todas as duplicatas não vazias, mas apenas uma estatística é atualizada automaticamente (independentemente da configuração assíncrona).
As atualizações automáticas de estatísticas ocorrem apenas quando o otimizador de consulta precisa de uma estatística específica e descobre que ela está desatualizada (uma recompilação relacionada à otimização).
O otimizador escolhe entre estatísticas duplicadas, conforme mencionado no documento Plan Caching and Recompilations in SQL Server 2012 :
O ponto é que o otimizador escolhe uma das estatísticas duplicadas disponíveis (a "melhor), e essa é atualizada automaticamente se for obsoleta.
Acredito que esta seja uma mudança no comportamento de versões mais antigas - ou pelo menos a documentação sugere que todas as estatísticas desatualizadas de um objeto seriam atualizadas como parte desse processo, mas não tenho ideia de quando isso mudou. Foi certamente depois de agosto de 2013, quando Matt Bowler postou Estatísticas Duplicadas , que contém um repositório prático baseado em AdventureWorks. Esse script agora resulta na atualização de apenas um dos objetos de estatísticas, enquanto na época ambos eram.
A explicação acima corresponde a todos os comportamentos que observei ao tentar reproduzir seu cenário, mas duvido que esteja explicitamente documentado em qualquer lugar. Parece uma otimização sensata, pois há pouco valor em manter as duplicatas totalmente atualizadas.
Isso provavelmente está em um nível de detalhes abaixo do que a Microsoft está disposta a oferecer. Isso também significa que pode mudar sem aviso prévio.