Ich untersuche das Optimierungsprogramm in SQL Server, insbesondere Histogramme, und sehe einige seltsame Ergebnisse.
Wenn ich die folgende Abfrage ausführe, bei der ich weiß, dass das Feld kein Histogramm enthält, gibt SQL Server eine Zeilenschätzung aus, die dem tatsächlichen Ergebnis entspricht. Wenn ich dieselbe Abfrage ausführen würde, bei der ich DECLARE @i NUMERIC(19,2) = 30.0
anstelle einer Konstanten verwende WHERE [Rate] < @i
, entspricht die Schätzung 94.8
der erwarteten Abfrage, da die Datenbank keine Statistiken für das Feld enthält.
Meine Frage ist also, warum SQL Server das richtige Ergebnis ausgibt, wenn keine Statistiken auf dem Feld vorhanden sind.
Beim Ausschalten, AUTO_CREATE_STATISTICS
wie in meiner Antwort angegeben, tritt bei den Zeilenschätzungen ein merkwürdiges Verhalten auf.
In der Tabelle ist eine Einschränkung vorhanden, die darauf beschränkt ist [Rate]
, zwischen zu liegen 6.5 - 200.0
. Die Schätzungen variieren stark , wenn je nach experimentieren , wenn >
verwendet wird , oder >=
sowie 24.0
oder 64
Format - Abfragen , wo das Prädikat zeigt eine implict Umwandlung zu geben money
.
Denn WHERE [Rate] > 6.5
die Schätzung ist, 28.44
welche dann bei Raten über stoppt 100
.
Wenn WHERE [Rate] > 7
Dezimalstellen ausgeschlossen sind, 28.44
läuft die Schätzung bis zu255
Denn WHERE [Rate] >= 6.5
die 28.44
Schätzung läuft bis zu ungefähr 100
und ändert sich dann 17.7764
bis zu, 1000
bevor die Schätzung auf 1 fällt.
Es scheint also nicht viel Konsistenz zu geben. Anscheinend ist sich SQL Server der Einschränkung bewusst, die auf einigen der Abfragen basiert, mit denen ich experimentiere, aber es ignoriert manchmal auch deren Vorhandensein.
quelle