Onde as estatísticas usadas pelo Query Optimizer estão fisicamente armazenadas em um arquivo de banco de dados do SQL Server e no Buffer Pool?
Mais especificamente, existe uma maneira de descobrir as páginas usadas pelas estatísticas usando DMVs e / ou DBCC?
Eu possuo livros do SQL Server 2008 Internals e do SQL Server Internals and Troubleshooting e nenhum deles fala sobre a estrutura física das estatísticas; se eles não conseguirem encontrar essas informações.
STATS_STREAM
que eu nunca verifiquei se isso é algo que pode ser encontrado no próprio arquivo.StatMan
) que gera um blob (ironicamente, esse nome é destacado como uma função em uma janela de consulta do SSMS). Logicamente, as estatísticas estão associados com um índice ou um conjunto de colunas da tabela, por isso gostaria de começar por analisar as tabelas de metadados internos que procuram umabinary
ouvarbinary
coluna que vai levar para o blob. Isso deve ser visualizado usandoDBCC PAGE
, mas provavelmente não de outra maneira, porque é tudo interno.sysindexes.statblob
mas desde 2005, que retornaNULL
e a localização é completamente sem documentos, apenas recuperável (que eu saiba) atéDBCC SHOW_STATISTICS(o, i) WITH STATS_STREAM;
.sys.sysidxstats
-, parece que há um ponteiro LOB nessa tabela. Ainda não tenho certeza de onde estão as estatísticas da coluna; eles podem estar nessa tabela e também há umatype
coluna.Respostas:
Encontrei-os.
Crie uma tabela com um objeto de estatísticas simples.
Conecte-se usando o DAC (
ADMIN:Server[\instance]
).Execute as seguintes consultas:
Você notará que,
imageval
para cada objeto de estatísticas, não é o mesmo que o blob de estatísticas, mas contém o blob de estatísticas - é apenas um deslocamento. No meu sistema, isso resultou em x (obviamente truncei um bocado de bits):E isso para y:
O mesmo aconteceu com as estatísticas baseadas em índices.
Provavelmente, você poderia validar ainda mais isso com uma série de consultas usando
DBCC
comandos. Primeiro, descubra as páginas envolvidas no índice em clustersys.sysobjvalues
(substitua o nome do banco de dados):O resultado listará várias páginas das quais você está interessado
PageType = 1
. Com um novo banco de dados, você poderá encontrar essas informações em uma das páginas com osPagePID
valores mais altos. Por exemplo, no meu sistema, essa era a página 281, então eu olhei mais de perto nessa página:Com certeza, encontrei os dados no slot 17:
(Em bancos de dados maiores, talvez você precise fazer muito mais caça e bicar, já que não há garantia de que mesmo um novo objeto de estatística termine em uma nova página.
Vá em frente e tente fazer isso em casa, mas há um motivo para você se conectar ao DAC para isso. Eu ficaria curioso para saber, é claro, o que você fará com essas informações que você não poderá fazer com a
DBCC SHOW_STATISTICS
saída.Observe que isso obviamente não tenta decodificar o
STATS_STREAM
para fornecer histograma ou outras informações, e não pude encontrar nenhuma evidência de que a saída tabularDBCC SHOW_STATISTICS ... WITH HISTOGRAM
seja armazenada em qualquer lugar no formato de tabela. Joe Chang tem algumas informações sobre decodificação, se é isso que você procura. Eu não acho que é algo que você gostaria de fazer em uma consulta - basta usarDBCC
.fonte