Ich habe viel Informationen zu finden auf was STATISTICS
sind: wie sie erhalten bleiben, wie sie manuell erstellt werden oder automatisch aus Abfragen oder Indizes, und so weiter. Ich konnte jedoch keine Anleitung oder Informationen zu "Best Practices" bezüglich des Zeitpunkts findenum sie zu erstellen: Welche Situationen profitieren mehr von einem manuell erstellten STATISTICS-Objekt als von einem Index? Ich habe manuell erstellte gefilterte Statistiken gesehen, die bei Abfragen von partitionierten Tabellen helfen (weil die für die Indizes erstellten Statistiken die gesamte Tabelle abdecken und nicht pro Partition sind - Brillaint!), Aber es muss sicherlich andere Szenarien geben, die von einem Statistikobjekt währenddessen profitieren würden Sie benötigen weder die Details eines Index noch die Kosten für die Aufrechterhaltung des Index oder die Erhöhung der Wahrscheinlichkeit von Blockierungen / Dead-Locks.
@ JonathanFite erwähnte in einem Kommentar eine Unterscheidung zwischen Indizes und Statistiken:
Indizes helfen SQL dabei, die Daten schneller zu finden, indem sie Lookups erstellen, die anders sortiert sind als die Tabelle selbst. Mithilfe von Statistiken kann SQL ermitteln, wie viel Arbeitsspeicher / Aufwand erforderlich ist, um die Abfrage zu erfüllen.
Das sind großartige Informationen, vor allem, weil es mir hilft, meine Frage zu klären:
Inwieweit hilft die Kenntnis dieser (oder anderer technischer Informationen darüber, was und wie sie mit dem Verhalten und der Art von zusammenhängen STATISTICS
) zu bestimmen, wann eine Auswahl getroffen CREATE STATISTICS
werden muss CREATE INDEX
, insbesondere wenn ein Index erstellt wird, um das zugehörige STATISTICS
Objekt zu erstellen ? Für welches Szenario ist es besser, nur die STATISTICS-Informationen und nicht den Index zu haben?
Es wäre sehr hilfreich, wenn Sie ein funktionierendes Beispiel für ein Szenario hätten, in dem das STATISTICS
Objekt besser passt als ein INDEX
.
Da ich ein visueller Lernender / Denker bin, dachte ich, es könnte hilfreich sein, die Unterschiede zwischen STATISTICS
und INDEX
nebeneinander zu sehen, um herauszufinden, wann STATISTICS
die bessere Wahl ist.
Thingy PROs CONs
------- ---------- -------------------
INDEX * Can help sorts. * Takes up space.
* Contains data (can * Needs to be maintained (extra I/O).
"cover" a query). * More chances for blocking / dead-locks.
STATISTICS * Takes up very little space. * Cannot help sorts.
* Lighter maintenance / won't * Cannot "cover" queries.
slow down DML operations.
* Does not increase chances
of blocking / dead-locks.
Das Folgende sind einige Ressourcen, die ich gefunden habe, als ich danach gesucht habe, eine, die sogar dieselbe Frage stellt, aber nicht beantwortet wurde:
Fragen zu SQL Server-Statistiken, die wir nicht beantworten konnten
Statistiken. Sind mehrspaltige Histogramme möglich?
** Um es klar auszudrücken, ich habe keine Antwort darauf und freue mich darauf, von hoffentlich ein paar Leuten Feedback zu bekommen, um etwas zu liefern, das hier in den Interwebs seltsamerweise zu fehlen scheint.
quelle
Antworten:
Ihre Frage dreht sich um Folgendes: Wann ist es eine gute Sache, nur Statistiken zu erstellen, anstatt einen Index zu erstellen (der Statistiken erstellt)?
Aus meiner SQL Server - Interna Notes (SQLSkills Klassen- IE1 und IE2) und SQL Server - Interna buchen , unten ist mein begrenzt Verständnis:
SQL Server-Statistiken sind nichts anderes als Systemobjekte, die wichtige Informationen zu den Indexschlüsselwerten und regulären Spaltenwerten enthalten.
SQL Server verwendet ein kostenbasiertes Modell, um so schnell wie möglich einen Ausführungsplan auszuwählen, der "gut genug" ist. Die Kardanilitätsschätzung (Schätzung der Anzahl der in jedem Schritt der Abfrageausführung zu verarbeitenden Zeilen) ist der wichtigste Faktor bei der Abfrageoptimierung, der sich auf die Join-Strategie, den Speicherbedarf, die Auswahl der Worker-Threads sowie die Auswahl der Indizes beim Datenzugriff auswirkt .
SQL Server verwendet keine nicht gruppierten Indizes, wenn geschätzt wird, dass ein großes Nein. Es ist eine Anzahl von KEY- oder RID-Loopup-Operationen erforderlich, sodass Statistiken zu Indizes (und zu Spalten) verwaltet werden, die bei solchen Schätzungen hilfreich sind.
Es gibt zwei wichtige Dinge über Statistiken:
Das Histogramm speichert Informationen zur Datenverteilung NUR für die am weitesten links stehende Statistikspalte (Index). Es werden auch Informationen zur Mehrspaltendichte der Schlüsselwerte gespeichert. Im Wesentlichen speichert das Histogramm die Datenverteilung nur für die Statistikspalte ganz links.
SQL Server behält unabhängig von der Tabellengröße höchstens 200 Schritte im Histogramm bei. Die Intervalle, die von den einzelnen Histogrammschritten abgedeckt werden, erhöhen sich mit der Vergrößerung der Tabelle, was bei großen Tabellen zu "weniger genauen" Statistiken führt.
Beachten Sie, dass die Indexselektivität eine Metrik ist, die umgekehrt proportional zur Dichte ist. Je mehr eindeutige Werte eine Spalte hat, desto höher ist ihre Selektivität.
Wenn bestimmte Abfragen nicht sehr häufig ausgeführt werden, können Sie festlegen, dass Statistiken auf Spaltenebene statt eines Index erstellt werden. Mithilfe von Statistiken auf Spaltenebene kann das Abfrageoptimierungsprogramm bessere Ausführungspläne finden, obwohl diese Ausführungspläne aufgrund der beteiligten Indexprüfungen nicht optimal sind. Gleichzeitig verursachen Statistiken bei Datenänderungsvorgängen keinen zusätzlichen Aufwand und tragen zur Vermeidung der Indexpflege bei. Dieser Ansatz funktioniert nur bei selten ausgeführten Abfragen.
Verweisen :
Hinweis: Jemand wie Paul White oder Aaron Bertrand kann sich melden, um Ihrer guten Frage mehr Farbe zu verleihen .
quelle
Ich würde sagen, Sie benötigen einen Index, wenn Sie die Datenmenge begrenzen / schnell auf die richtigen Daten basierend auf den Feldern zugreifen möchten.
Sie benötigen Statistiken, wenn der Optimierer die Art der Daten verstehen soll, um die Vorgänge bestmöglich ausführen zu können.
Wie ich herausgefunden habe, sind gefilterte Statistiken hilfreich, wenn Ihre Daten Abweichungen aufweisen, die sich stark auf den Plan auswirken, z. B. bei einem Stapelüberlauf. Nur wenige Benutzer haben eine große Anzahl von Posts. Daher ist es nicht wirklich die beste Schätzung, nur durchschnittliche Posts pro Benutzer zu verwenden. Sie könnten also eine gefilterte Statistik für userId erstellen, die auf dem Benutzernamen basiert, und dann sollte SQL Server wissen, dass, wenn dieser Benutzername in der Abfrage enthalten ist, dies die Benutzer-ID ist, die er erhält, und in der Lage sein sollte, das herauszufinden Das indizierte Feld in der Tabelle posts enthält eine große Anzahl von Zeilen mit dieser ID, da dort ein Histogramm vorhanden ist. Mit Durchschnittswerten ist das nicht möglich.
quelle
UserID
in der JOIN-Bedingung, auch wenn nicht in derWHERE
? Und wäre das nicht gut genug, um einen gefilterten Index aufzunehmen?WHERE BitColumn = 0
für eine einfache Abfrage ausgewähltWHERE BitColumn <> 1
. (Und um klar zu sein, die Bitspalte war nicht nullwertfähig.) Ich glaube, es gab ähnliche Fälle wieIntColumn > 10
NichtübereinstimmungIntColumn >= 11
.Von 70-461 Schulungsbuch von Itzik Ben-Gan
Es gibt nur wenige mögliche Gründe, um Statistiken manuell zu erstellen. Ein Beispiel ist, wenn ein Abfrageprädikat mehrere Spalten mit spaltenübergreifenden Beziehungen enthält. Statistiken zu mehreren Spalten können zur Verbesserung des Abfrageplans beitragen. Statistiken für mehrere Spalten enthalten spaltenübergreifende Dichten, die in Einzelspaltenstatistiken nicht verfügbar sind. Wenn sich die Spalten jedoch bereits im selben Index befinden, ist das mehrspaltige Statistikobjekt bereits vorhanden, sodass Sie kein zusätzliches manuell erstellen sollten.
quelle