Encontrei-os.
Crie uma tabela com um objeto de estatísticas simples.
CREATE DATABASE splunge;
GO
USE splunge;
GO
CREATE TABLE dbo.foo(bar INT, munge INT);
GO
CREATE STATISTICS x ON dbo.foo(bar);
CREATE STATISTICS y ON dbo.foo(munge);
GO
INSERT dbo.foo SELECT s1.[object_id], s2.[object_id]
FROM sys.objects AS s1
CROSS JOIN sys.objects AS s2;
GO
UPDATE STATISTICS dbo.foo;
GO
Conecte-se usando o DAC (ADMIN:Server[\instance]
).
Execute as seguintes consultas:
DBCC SHOW_STATISTICS('dbo.foo', 'x') WITH STATS_STREAM;
DBCC SHOW_STATISTICS('dbo.foo', 'y') WITH STATS_STREAM;
SELECT name, imageval
FROM sys.stats AS s
INNER JOIN sys.sysobjvalues AS o
ON s.object_id = o.objid
AND s.stats_id = o.subobjid
WHERE
s.object_id = OBJECT_ID('dbo.foo');
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):
0x0100...bunch of chars...000007000000C4E1BE00EEA0...rest the same
0x07000000C4E1BE00EEA0...rest the same
E isso para y:
0x0100...bunch of chars...430007000000C7E1BE00EEA0...rest the same
0x07000000C7E1BE00EEA0...rest the same
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 cluster sys.sysobjvalues
(substitua o nome do banco de dados):
DBCC IND('splunge', 'sys.sysobjvalues', 1);
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 os PagePID
valores mais altos. Por exemplo, no meu sistema, essa era a página 281, então eu olhei mais de perto nessa página:
DBCC TRACEON(3604);
DECLARE @dbid INT = DB_ID();
DBCC PAGE(@dbid, 1, 281, 3);
DBCC TRACEOFF(3604);
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 tabular DBCC 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 usar DBCC
.
STATS_STREAM
que eu nunca verifiquei se isso é algo que pode ser encontrado no próprio arquivo.