Los encontré.
Crea una tabla con un simple objeto de estadísticas.
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
Conéctese utilizando el DAC ( ADMIN:Server[\instance]
).
Ejecute las siguientes 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');
Notarás que imageval
para cada objeto de estadísticas no es lo mismo que el blob de estadísticas, pero contiene el blob de estadísticas, es solo un desplazamiento. En mi sistema produjo esto para x (obviamente he truncado un poco de bits):
0x0100...bunch of chars...000007000000C4E1BE00EEA0...rest the same
0x07000000C4E1BE00EEA0...rest the same
Y esto para ti:
0x0100...bunch of chars...430007000000C7E1BE00EEA0...rest the same
0x07000000C7E1BE00EEA0...rest the same
Lo mismo era cierto para las estadísticas basadas en índices.
Probablemente podría hacer una mayor validación de esto con una serie de consultas utilizando DBCC
comandos. Primero, descubra las páginas que están involucradas con el índice agrupado en sys.sysobjvalues
(sustituya el nombre de su base de datos):
DBCC IND('splunge', 'sys.sysobjvalues', 1);
El resultado enumerará un montón de páginas, en las que está interesado PageType = 1
. Con una nueva base de datos, debería poder encontrar esta información en una de las páginas con los PagePID
valores más altos. Por ejemplo, en mi sistema, esta era la página 281, así que miré más de cerca esa página:
DBCC TRACEON(3604);
DECLARE @dbid INT = DB_ID();
DBCC PAGE(@dbid, 1, 281, 3);
DBCC TRACEOFF(3604);
Efectivamente, encontré los datos en la ranura 17:
(En bases de datos más grandes, es posible que tenga que cazar y picotear mucho más, ya que no hay garantía de que incluso un nuevo objeto de estadísticas termine en una nueva página (er)).
Siga adelante e intente esto en casa, pero hay una razón por la que necesita conectarse con el DAC para esto. Me gustaría saber, por supuesto, qué harás con esta información que no podrías hacer con la DBCC SHOW_STATISTICS
salida.
Tenga en cuenta que esto, por supuesto, no intenta decodificar el STATS_STREAM
para proporcionar histograma u otra información, y no pude encontrar ninguna evidencia de que la salida tabular de DBCC SHOW_STATISTICS ... WITH HISTOGRAM
se almacena en cualquier lugar en formato de tabla. Joe Chang tiene información sobre la decodificación si eso es lo que buscas. No creo que sea algo que quiera hacer en una consulta, solo use DBCC
.
STATS_STREAM
archivo binario que nunca he investigado si esto es algo que se puede encontrar en el archivo.