Wo werden die vom Abfrageoptimierungsprogramm verwendeten Statistiken physisch in einer SQL Server-Datenbankdatei und im Pufferpool gespeichert?
Gibt es eine Möglichkeit, die von Statistiken verwendeten Seiten mithilfe von DMVs und / oder DBCC herauszufinden?
Ich besitze sowohl SQL Server 2008-Interna als auch SQL Server-Interna und Fehlerbehebungsbücher. In keinem dieser Bücher geht es um die physische Struktur der Statistiken. Andernfalls kann ich diese Informationen nicht finden.
STATS_STREAM
angezeigt, in der ich noch nie nachgesehen habe, ob dies in der Datei selbst auffindbar ist.StatMan
) erstellt, die einen Blob ausgibt (ironischerweise wird dieser Name als Funktion in einem SSMS-Abfragefenster hervorgehoben). Logischerweise sind Statistiken mit einem Index oder einer Reihe von Tabellenspalten verknüpft, daher würde ich zunächst die internen Metadatentabellen auf einebinary
oder einevarbinary
Spalte untersuchen, die zum Blob führt. Dies sollte mit sichtbar seinDBCC PAGE
, aber wahrscheinlich nicht anders, weil es alles intern ist.sysindexes.statblob
aber seit 2005 kehrt es zurückNULL
und der Ort ist komplett undokumentiert, nur abrufbar (das weiß ich) durchDBCC SHOW_STATISTICS(o, i) WITH STATS_STREAM;
.sys.sysidxstats
- es sieht so aus, als ob sich in dieser Tabelle ein LOB-Zeiger befindet. Ich bin mir noch nicht sicher, wo die Spaltenstatistiken sind. Sie könnten in dieser Tabelle stehen, genauso wie es einetype
Spalte gibt.Antworten:
Fand sie.
Erstellen Sie eine Tabelle mit einem einfachen Statistikobjekt.
Stellen Sie eine Verbindung mit dem DAC (
ADMIN:Server[\instance]
) her.Führen Sie die folgenden Abfragen aus:
Sie werden feststellen, dass
imageval
für jedes Statistikobjekt nicht dasselbe gilt wie für das Statistik-Blob, es enthält jedoch das Statistik-Blob - es ist lediglich ein Versatz. Auf meinem System ergab sich folgendes für x (ich habe offensichtlich einiges abgeschnitten):Und das für Sie:
Gleiches gilt für indexbasierte Statistiken.
Sie könnten dies wahrscheinlich mit einer Reihe von Abfragen unter Verwendung von
DBCC
Befehlen überprüfen. Ermitteln Sie zunächst die Seiten, die am Clustered-Index beteiligt sindsys.sysobjvalues
(ersetzen Sie Ihren Datenbanknamen):Das Ergebnis enthält eine Reihe von Seiten, an denen Sie interessiert sind
PageType = 1
. Mit einer neuen Datenbank sollten Sie diese Informationen auf einer der Seiten mit den höchstenPagePID
Werten finden. Auf meinem System war dies beispielsweise Seite 281, also habe ich mir diese Seite genauer angesehen:Natürlich habe ich die Daten in Slot 17 gefunden:
(Bei größeren Datenbanken müssen Sie möglicherweise viel mehr suchen und picken, da nicht garantiert werden kann, dass auch ein neues Statistikobjekt auf einer neuen (er) Seite angezeigt wird.)
Probieren Sie dies zu Hause aus, aber es gibt einen Grund, warum Sie sich dafür mit dem DAC verbinden müssen. Ich wäre natürlich gespannt, was Sie mit diesen Informationen machen werden, die Sie mit der
DBCC SHOW_STATISTICS
Ausgabe nicht machen könnten .Beachten Sie, dass dies natürlich nicht versucht, das
STATS_STREAM
Histogramm oder andere Informationen zu dekodieren , und ich konnte keine Beweise dafür finden, dass die tabellarische Ausgabe vonDBCC SHOW_STATISTICS ... WITH HISTOGRAM
irgendwo im Tabellenformat gespeichert ist. Joe Chang hat einige Informationen zum Dekodieren, wenn Sie danach suchen. Ich glaube nicht, dass Sie das in einer Abfrage tun möchten - verwenden Sie einfachDBCC
.quelle