Ich bin auf dieses kleine Problem gestoßen, als ich versucht habe, ein komplexeres Problem zu lösen, und bin mit dem Versuch, den Optimierer herauszubekommen, am Ende meiner Arbeit angelangt. Also, sagen wir, ich habe eine Tabelle mit dem Namen 'MyTable', die wie folgt definiert werden kann:
%Vor% Diese Tabelle enthält 286.685 Zeilen und das Ausführen von DBCC SHOW_STATISTICS('MyTable','PK_MyTable')
ergibt:
Jetzt führe ich eine Abfrage für diese Tabelle aus, ohne dass zusätzliche Indizes oder Statistiken erstellt wurden.
%Vor% Es erscheinen nun zwei neue Statistikobjekte, eines für die Spalte SiteID
und das andere für die Spalte DeleteDateTime
. Hier sind sie jeweils (Hinweis: Einige nicht relevante Informationen wurden ausgeschlossen):
Der Ausführungsplan, der für die Abfrage generiert wurde, die ich oben ausgeführt habe, gibt mir keine Überraschungen. Es besteht aus einem einfachen Clustered-Index-Scan mit 14282.3 geschätzten Zeilen und 15676 tatsächlichen Zeilen. Aus dem, was ich über Statistiken und Kostenschätzung gelernt habe, kann man mit den beiden obigen Histogrammen die Selektivität von SiteID (16005.02 / 286685) mal die Selektivität von DeleteDateTime (255827/286685) multiplizieren, um eine zusammengesetzte Selektivität von 0,0498187307480119 zu erhalten. Multiplizieren wir das mal mit der Gesamtzahl der Zeilen (286685), erhalten wir genau dasselbe, was der Optimierer gemacht hat: 14282.3 .
Aber hier ist ich verwirrt. Ich erstelle einen Index mit CREATE INDEX IX_MyTable ON Mytable (SiteID, DeleteDateTime)
, der ein eigenes Statistikobjekt erstellt:
Wenn ich dieselbe Abfrage wie zuvor ( SELECT GroupClosuresID FROM MyTable WHERE SiteID = 1397 AND DeleteDateTime IS NULL
) ausführe, bekomme ich immer noch 15676 Zeilen zurück, aber meine geschätzte Zeilenanzahl ist jetzt 181.82 .
Ich habe versucht, Zahlen zu manipulieren, um herauszufinden, wo diese Schätzung herkommt, aber ich kann es einfach nicht verstehen. Ich muss annehmen, dass es mit den Dichtewerten für IX_MyTable zusammenhängt.
Jede Hilfe wird sehr geschätzt. Danke !!
EDIT: Hier ist der Ausführungsplan für die letzte Abfrageausführung.
Dieser hat etwas gegraben!
Es ist ein Produkt von:
NULL
dichte in deinem Datumsfeld (aus deinem ersten Satz von Statistiken 255827/286685 = .892363
siteid
) in Ihrem neuen Index: 0.0007107321
Die Formel lautet:
%Vor%Ich nehme an, dass der Optimierer die einfachste Route genommen hat und nur die Wahrscheinlichkeiten multipliziert hat, da die Zeilenanzahl in diesem Fall nichts beeinflusst.
Tags und Links sql sql-server sql-server-2008 query-optimization