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.0anstelle einer Konstanten verwende WHERE [Rate] < @i, entspricht die Schätzung 94.8der 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_STATISTICSwie 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.0oder 64Format - Abfragen , wo das Prädikat zeigt eine implict Umwandlung zu geben money.
Denn WHERE [Rate] > 6.5die Schätzung ist, 28.44welche dann bei Raten über stoppt 100.
Wenn WHERE [Rate] > 7Dezimalstellen ausgeschlossen sind, 28.44läuft die Schätzung bis zu255
Denn WHERE [Rate] >= 6.5die 28.44Schätzung läuft bis zu ungefähr 100und ändert sich dann 17.7764bis zu, 1000bevor 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.




