Até agora, eu tinha a impressão de que existem dois tipos de objetos estatísticos no SQL Server:
estatísticas criadas automaticamente , que são criadas pelo SQL Server em colunas de índice ou colunas únicas para melhorar o desempenho e
estatísticas criadas pelo usuário , que são criadas manualmente com uma
CREATE STATISTICS
instrução.
Assim, fiquei bastante surpreso ao ver a seguinte consulta:
SELECT s.name, s.stats_id, s.auto_created, s.user_created
FROM sys.stats AS s
INNER JOIN sys.stats_columns AS sc ON s.object_id = sc.object_id AND s.stats_id = sc.stats_id
INNER JOIN sys.columns AS c ON sc.object_id = c.object_id AND sc.column_id = c.column_id
INNER JOIN sys.tables AS t ON c.object_id = t.object_id
WHERE t.name = 'mytable'
dê o seguinte resultado:
name stats_id auto_created user_created
--------------------------------------------------------------
PK__mytable__7A73B1B8 1 0 0
SomeIndex 2 0 0
SomeIndexedColumn1 3 0 0
SomeIndexedColumn2 4 0 0
SomeIndexedColumn3 5 0 0
SomeColumn 6 0 1
Quais são essas estatísticas, que não são nem auto_created nem user_created? Eu olhei a documentação de sys.stats , mas não encontrei uma resposta lá.
Essas são estatísticas criadas com a criação de um índice.
Acho que de alguma forma eles inferem que as estatísticas não foram criadas como estatísticas, mas como um efeito colateral de um índice.
Eu notei isso em meus bancos de dados antes e eles parecem estar sempre relacionados ao índice. Não consigo encontrar nenhuma documentação que comprove isso.
Sim, as estatísticas podem ser criadas de 3 maneiras:
1) Estatísticas criadas devido à criação do índice. Essas estatísticas têm o nome do índice
2) Estatísticas criadas pelo Optimizer (estatísticas da coluna). Começa com WA *
3) Estatísticas definidas pelo usuário que são criadas com o comando CREATE STATISTICS pelo DBA
ref: https://harshdba.wordpress.com/category/sql-server-statistics/