Trovati.
Crea una tabella con un semplice oggetto stats.
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
Connettersi utilizzando il DAC ( ADMIN:Server[\instance]
).
Esegui le seguenti query:
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');
Noterai che imageval
per ogni oggetto stats non è uguale al BLOB delle statistiche, ma contiene il BLOB delle statistiche: è solo sfalsato. Sul mio sistema ha prodotto questo per x (ovviamente ho troncato un bel po 'di bit):
0x0100...bunch of chars...000007000000C4E1BE00EEA0...rest the same
0x07000000C4E1BE00EEA0...rest the same
E questo per y:
0x0100...bunch of chars...430007000000C7E1BE00EEA0...rest the same
0x07000000C7E1BE00EEA0...rest the same
Lo stesso valeva per le statistiche basate sull'indice.
Probabilmente potresti fare un'ulteriore convalida di questo con una serie di query usando i DBCC
comandi. Innanzitutto, individua le pagine interessate dall'indice cluster su sys.sysobjvalues
(sostituisci il nome del tuo database):
DBCC IND('splunge', 'sys.sysobjvalues', 1);
Il risultato elencherà un sacco di pagine di cui sei interessato PageType = 1
. Con un nuovo database, dovresti essere in grado di trovare queste informazioni su una delle pagine con i PagePID
valori più alti. Ad esempio sul mio sistema questa era la pagina 281, quindi ho guardato più da vicino a quella pagina:
DBCC TRACEON(3604);
DECLARE @dbid INT = DB_ID();
DBCC PAGE(@dbid, 1, 281, 3);
DBCC TRACEOFF(3604);
Abbastanza sicuro, ho trovato i dati nello slot 17:
(Su database più grandi, potresti dover fare molto di più a caccia e beccare, dal momento che non c'è garanzia che anche un nuovo oggetto stats finirà in una nuova pagina (er).)
Vai avanti e prova questo a casa, ma c'è un motivo per cui devi connetterti con il DAC per questo. Sarei curioso di sapere, ovviamente, cosa farai con queste informazioni che non potresti fare con l' DBCC SHOW_STATISTICS
output.
Si noti che questo ovviamente non tenta di decodificare il file STATS_STREAM
per fornire istogramma o altre informazioni, e non sono riuscito a trovare alcuna prova che l'output tabulare di DBCC SHOW_STATISTICS ... WITH HISTOGRAM
sia archiviato ovunque nel formato tabella. Joe Chang ha alcune informazioni sulla decodifica se è quello che stai cercando. Non credo sia qualcosa che vorresti fare in una query: basta usare DBCC
.
STATS_STREAM
che non ho mai verificato se si trova qualcosa nel file stesso.