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

Warum verwendet diese Abfrage nicht den richtigen Index?

Es weiß nicht, welchen Wert die Variablen haben werden, wenn es die Abfrage kompiliert. Sie könnten OPTION (RECOMPILE) versuchen .

Ich nehme an, dass die Hinzufügung des AND -Klausel in der Abfrage (obwohl sie logischerweise dadurch überhaupt nicht selektiver wird) muss den Optimierer dazu verleiten, die Abfrage mit größerer Selektivität zu schätzen, wodurch Sie den gewünschten Plan erhalten!

Sie sagen in den Kommentaren, dass die Version ohne das ExceptionDate = ExceptionDate ist wird auf 88234.8 geschätzt Zeilen und die Version mit 8823.48

Im Allgemeinen greift SQL Server in Ermangelung verwendbarer Statistiken auf Heuristiken zurück, die vom Typ des Vergleichsoperators im Prädikat abhängen.

Es wird davon ausgegangen, dass ein > Das Prädikat gibt beispielsweise 30 % der Zeilen zurück, und zwar ein = Das Prädikat gibt 10 % der Zeilen zurück, sodass es so aussieht, als ob es dies direkt auf das Ergebnis der ersten Schätzung anwendet. Interessanterweise wird hier nicht berücksichtigt, dass das Gleiche gegen die Spalte selbst steht!

vgl. Best Practices für die Verwaltung von Statistiken – Vermeiden Sie die Verwendung lokaler Variablen in Abfragen