Estou fazendo alguns testes em atualizações automáticas de estatísticas sincronizadas e assíncronas. Eu gostaria de invalidar rapidamente todos os objetos estatísticos (cabeçalhos, vetores de densidade e histogramas) para garantir que na próxima vez que a estatística for usada, ela será atualizada .
Estou tentando simular uma atualização automática de estatísticas, não uma criação automática.
Idealmente, não quero alterar a contagem de linhas, por isso descartei INSERT/DELETE
as operações. Idealmente, também não quero alterar nenhum valor de dados, considerei o uso UPDATE
de instruções, mas acho que isso pode demorar muito em algumas das minhas tabelas maiores.
Eu tinha olhado, UPDATE STATISTICS WITH ROWCOUNT, PAGECOUNT
mas não acho que é isso que estou procurando. Eu esperava que houvesse talvez um sinalizador de rastreamento ou comando não documentado que invalidasse as estatísticas.
Existe uma maneira rápida e eficiente de fazer o que quero alcançar que não considerei?
Estou testando no SQL Server 2016.
A sequência mais confiável que posso encontrar para causar uma atualização automática de estatísticas é:
Atualizar estatísticas com amostragem zero de linhas
Isso resulta em um objeto de estatística vazio.
Atualize a(s) coluna(s) de destino em uma única linha da tabela
Isso incrementa o contador de modificação da coluna. A combinação de um objeto de estatísticas vazio e um contador de modificação incrementado permite uma atualização de estatísticas de caso especial (simula a criação de estatísticas em uma tabela vazia e, em seguida, a adição de uma linha).
Execute a consulta com
OPTION (RECOMPILE)
Isso causa uma atualização automática das estatísticas desatualizadas detectadas, mesmo se um plano correspondente para a consulta já estiver presente no cache. A atualização de estatísticas resultante causará subseqüentemente uma recompilação baseada em otimização para o plano original em cache, se for correspondido novamente.
Demonstração
Usando uma consulta AdventureWorks semelhante à usada na resposta de jyao , o script a seguir reúne tudo acima:
Resultado
Os
DBCC SHOW_STATISTICS
resultados mostram o cabeçalho de estatísticas original, o cabeçalho vazio e o cabeçalho atualizado desejado no final do processo:Não tenho certeza se o método a seguir atenderá às suas necessidades, eu diria que você pode tentar fazer isso:
Isso realmente apagará todas as informações em suas estatísticas (que são os próprios objetos do servidor sql e ainda estão lá, ou seja, NÃO excluirá as próprias estatísticas)
De acordo com MSDN
Para mim, esvaziar suas estatísticas pode ser considerado uma forma de "invalidar" suas estatísticas. :-)
[ Update ] Fiz um teste rápido no SQL2014 da seguinte forma:
e eu posso ver o seguinte
e eu posso executar o seguinte
Receberei um Plano de Execução da seguinte forma
agora vou fazer o seguinte
e eu verei as estatísticas serem apagadas.
Agora se eu correr
Vou obter um plano Exec diferente.
Outro método que acabou de me ocorrer e que não considerei inicialmente é usar uma atualização sem atualização para modificar apenas as linhas suficientes para acionar o limite que poderia ser alcançado usando algo semelhante ao T-SQL abaixo: