Onde estão as estatísticas usadas pelo Query Optimizer armazenadas fisicamente dentro de um arquivo de banco de dados do SQL Server e do Buffer Pool?
Mais especificamente, existe uma maneira de descobrir as páginas usadas pelas estatísticas usando DMVs e/ou DBCC?
Eu possuo os livros SQL Server 2008 Internals e SQL Server Internals and Troubleshooting e nenhum deles fala sobre a estrutura física das estatísticas; se o fizerem, não conseguirei encontrar essa informação.
Encontrei-os.
Crie uma tabela com um objeto de estatísticas simples.
Conecte 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 trunquei alguns bits):E isso para y:
O mesmo aconteceu com as estatísticas baseadas em índices.
Você provavelmente poderia fazer uma validação adicional disso com uma série de consultas usando
DBCC
comandos. Primeiro, descubra as páginas que estão envolvidas com o índice clusterizadosys.sysobjvalues
(substitua o nome do seu banco de dados):O resultado listará um monte de páginas, você está interessado nas de
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, esta era a página 281, então olhei mais de perto para essa página:Com certeza, encontrei os dados no slot 17:
(Em bancos de dados maiores, você pode ter que fazer muito mais buscas e bicadas, já que não há garantia de que mesmo um novo objeto de estatísticas acabe em uma nova página.)
Vá em frente e tente fazer isso em casa, mas há um motivo pelo qual você precisa se conectar ao DAC para isso. Eu ficaria curioso para saber, é claro, o que você vai fazer com essa informação que não poderia 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 consegui encontrar nenhuma evidência de que a saída tabular deDBCC SHOW_STATISTICS ... WITH HISTOGRAM
esteja armazenada em qualquer lugar no formato de tabela. Joe Chang tem algumas informações sobre decodificação, se é isso que você procura. Não acho que seja algo que você gostaria de fazer em uma consulta - basta usarDBCC
.