Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Die Verwendung von Variablen in der Abfrage generiert einen anderen Abfrageplan

Denn wenn Sie FIXED-Werte mit ausgeschalteter AUTO-PARAMETERISIERUNG verwenden, weiß der Abfrageplan GENAU, für welchen Wert er die Abfrage ausführen muss. Der Plan ist also SPEZIELL auf diese Werte abgestimmt.

Wenn Sie jedoch Variablen verwenden, ist der Plan, der in den Abfrage-Cache gestellt wird, derjenige, der die parametrisierten Variablen enthält – die durch jede Variable ersetzt werden können und denselben Plan wiederverwenden. Daher müssen diese Pläne robuster und generischer sein, um den "besten Durchschnittsfall" zu handhaben.

In SQL Server 2008 können Sie festlegen, ob einfache Parameter automatisch parametrisiert werden oder nicht, sodass Sie stets den „Best Average Case“-Plan erhalten – mit all seinen Vor- und Nachteilen.

Ref:

BEARBEITEN - zur Leistung

Was die Leistung betrifft, kann der Optimierer Fehler machen - in diesem Fall hat er in Statistiken for the exact values gesucht und war der Meinung, dass der Index nicht hilfreich ist (möglicherweise ein Wendepunktproblem), daher ist stattdessen ein geclusterter Scan geplant. Es ist eine Kunst, einen Abfrageplan zu erzwingen - aber die Verwendung eines Indexes ist eindeutig 50 % schneller für

  1. spezifische Hardware
  2. Datenverteilung zu einem bestimmten Zeitpunkt
  3. bestimmte Werte angegeben

Wenn ich keinen sehr, sehr guten Grund hätte, würde ich den Abfrageoptimierer nicht spielen (z. B. mit Indexhinweisen), es sei denn, ich habe viele Daten, um zu beweisen, dass er ihn ausnahmslos schneller macht.