Znalazłem ich.
Utwórz tabelę z prostym obiektem statystyk.
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
Połącz za pomocą DAC ( ADMIN:Server[\instance]
).
Uruchom następujące zapytania:
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');
Zauważysz, że imageval
dla każdego obiektu statystyk nie jest to samo, co obiekt blob statystyki, ale zawiera on obiekt blob statystyki - jest po prostu przesunięty. W moim systemie uzyskałem to dla x (oczywiście skróciłem sporo bitów):
0x0100...bunch of chars...000007000000C4E1BE00EEA0...rest the same
0x07000000C4E1BE00EEA0...rest the same
A to dla ciebie:
0x0100...bunch of chars...430007000000C7E1BE00EEA0...rest the same
0x07000000C7E1BE00EEA0...rest the same
To samo dotyczy statystyk opartych na indeksach.
Prawdopodobnie można by to zrobić za pomocą szeregu zapytań za pomocą DBCC
poleceń. Najpierw dowiedz się, które strony są powiązane z indeksem klastrowym sys.sysobjvalues
(zastąp nazwę bazy danych):
DBCC IND('splunge', 'sys.sysobjvalues', 1);
Wynik wyświetli listę stron, którymi jesteś zainteresowany PageType = 1
. Dzięki nowej bazie danych powinieneś być w stanie znaleźć te informacje na jednej ze stron o najwyższych PagePID
wartościach. Np. W moim systemie była to strona 281, więc wtedy przyjrzałem się bliżej tej stronie:
DBCC TRACEON(3604);
DECLARE @dbid INT = DB_ID();
DBCC PAGE(@dbid, 1, 281, 3);
DBCC TRACEOFF(3604);
Rzeczywiście, znalazłem dane w gnieździe 17:
(W większych bazach danych może być konieczne wykonanie znacznie więcej polowań i dziobania, ponieważ nie ma gwarancji, że nawet nowy obiekt statystyk znajdzie się na nowej (er) stronie).
Spróbuj tego w domu, ale jest powód, dla którego musisz połączyć się z DAC. Byłbym ciekawy, oczywiście, co zamierzasz zrobić z tymi informacjami, których nie możesz zrobić z danymi DBCC SHOW_STATISTICS
wyjściowymi.
Zauważ, że to oczywiście nie próbuje dekodować w STATS_STREAM
celu dostarczenia histogramu lub innych informacji, i nie mogłem znaleźć żadnego dowodu, że wynik tabelaryczny DBCC SHOW_STATISTICS ... WITH HISTOGRAM
jest przechowywany gdziekolwiek w formacie tabeli. Joe Chang ma pewne informacje na temat dekodowania, jeśli tego właśnie szukasz. Nie sądzę, żeby to było coś, co chciałbyś zrobić w zapytaniu - po prostu użyj DBCC
.
STATS_STREAM
którego nigdy nie analizowałem, czy jest to coś, co można znaleźć w samym pliku.