Gdzie statystyki używane przez Optymalizator zapytań są fizycznie przechowywane w pliku bazy danych SQL Server i puli buforów?
Mówiąc dokładniej, czy istnieje sposób, aby dowiedzieć się, które strony są wykorzystywane przez statystyki przy użyciu DMV i / lub DBCC?
Jestem właścicielem zarówno SQL Server 2008 Internals, jak i SQL Server Wewnętrznych i książek o rozwiązywaniu problemów i żadna z nich nie mówi o fizycznej strukturze statystyk; jeśli tak, nie będę w stanie znaleźć tych informacji.
STATS_STREAM
którego nigdy nie analizowałem, czy jest to coś, co można znaleźć w samym pliku.StatMan
), która generuje obiekt blob (jak na ironię, nazwa ta jest podświetlona jako funkcja w oknie zapytania SSMS). Logicznie statystyki są powiązane z indeksem lub zestawem kolumn tabeli, więc zacznę od zbadania wewnętrznych tabel metadanych w poszukiwaniubinary
lubvarbinary
kolumny, która doprowadzi do obiektu blob. Powinno to być widoczne przy użyciuDBCC PAGE
, ale prawdopodobnie nie w żaden inny sposób, ponieważ wszystko jest wewnętrzne.sysindexes.statblob
ale od 2005 roku powraca,NULL
a lokalizacja jest całkowicie nieudokumentowana, można ją tylko odzyskać (o której wiem)DBCC SHOW_STATISTICS(o, i) WITH STATS_STREAM;
.sys.sysidxstats
środku - wygląda na to, że w tej tabeli znajduje się wskaźnik LOB. Nie jestem pewien, gdzie są jeszcze statystyki kolumn; mogą być w tej tabeli, a także wtype
kolumnie.Odpowiedzi:
Znalazłem ich.
Utwórz tabelę z prostym obiektem statystyk.
Połącz za pomocą DAC (
ADMIN:Server[\instance]
).Uruchom następujące zapytania:
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):A to dla ciebie:
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 klastrowymsys.sysobjvalues
(zastąp nazwę bazy danych):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ższychPagePID
wartościach. Np. W moim systemie była to strona 281, więc wtedy przyjrzałem się bliżej tej stronie: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 tabelarycznyDBCC 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żyjDBCC
.źródło