In Ordnung, vorausgesetzt, Sie sprechen von einer lokalen Variablen, die von einer Abfrage in SSMS ausgeführt wird, da nichts anderes angegeben wurde. Selbst wenn Sie denselben Wert für den Wert verwenden, den
AND UserStatus = @userStatus
Sie im Literal verwenden AND UserStatus = 1
würden, sehen Sie einen Unterschied in Ihrem Ausführungsplan aufgrund der Art und Weise, wie die Kardinalitätsschätzung generiert wird.
Wenn Sie einen Literalwert verwenden, geht SQL Server zum Histogramm für diese Tabelle und zeigt an, wo dieser Wert in den Bereichsschlüssel passt. Die darauf gesammelte Schätzung führt zu einem von zwei Szenarien.
HISTOGRAM DIRECT HIT Im Wesentlichen bedeutet dies, dass RANGE_HI_KEY
für diesen bestimmten Literalwert in Ihrer Abfrage ein Wert (oberer Spaltenwert für jeden Schritt im Histogramm) vorhanden ist. Daher entspricht die Schätzung der Anzahl EQ_ROWS
( Anzahl der Zeilen, deren Wert dem entspricht RANGE_HI_KEY
) im Histogramm . Dies bedeutet, dass Ihre Schätzung die Anzahl der Zeilen ist, die diesem Wert entsprechen, basierend auf der letzten Aktualisierung der Statistiken.
HISTOGRAMM INTRA-STEP HIT Dies ist der Fall, wenn der Wert in einem Bereich zwischen zwei RANGE_HI_KEY
Werten liegt. Wenn Ihr Literalwert zwischen diesem Bereich liegt, wird er durch RANGE_ROWS
(Anzahl der Zeilen zwischen zwei Histogrammschritten), DINSTINCT_RANGE
(Anzahl der unterschiedlichen Werte innerhalb dieses Histogrammschritts) und AVG_RANGE_ROWS
( RANGE_ROWS
/ DISTINCT_RANGE_ROWS
) berechnet und gibt Ihnen Ihre Schätzung.
Wenn Sie jedoch mit einer lokalen Variablen ausgeführt werden, werden diese Werte nicht mehr im Histogramm angezeigt, da @Variable
sie zur Laufzeit nicht bekannt sind.
Für weitere Informationen zu diesem Thema empfehle ich, dieses Whitepaper von Joe Sack zu lesen .
DICHTE-VEKTOR Wenn es keinen bestimmten Wert gibt, verwendet SQL Server stattdessen eine Dichte, um die geschätzte Anzahl der für dieses Prädikat zurückgegebenen Zeilen bestimmen zu können. Die Dichte beträgt 1 / die Anzahl der unterschiedlichen Werte in dieser Spalte. Dann ist Ihre Kardinalitätsschätzung Dichte * die Anzahl der Zeilen in der Tabelle.
So lange Rede, kurzer Sinn, nein. Selbst wenn Sie denselben Wert immer wieder mit einer lokalen Variablen ausführen, erhalten Sie aus Gründen, die im Link Eric Provided von Kendra Little näher erläutert werden, nicht dieselben Ergebnisse .