an dieser Geige Werfen Sie einen Blick: http://sqlfiddle.com/#!6/18324/2SQL Server verwenden statt suchen scannen, wenn eine Fensterfunktion und Prädikat enthält eine Variable
den ersten Ausführungsplan erweitern, für die Abfragen gegen Ansicht B
.
Beachten Sie, dass die erste Abfrage mit der Indexsuche ausgeführt wird, während die zweite mit Indexsuche ausgeführt wird. In meinem realen Setup mit Tausenden von Zeilen erzeugt dies einen beträchtlichen Leistungseinbruch.
WTF ???
Die Abfragen sind gleichwertig, nicht wahr? Warum erzeugt ein Literal Suche und eine Variable - scan?
Aber noch wichtiger: wie kann ich um diese umgehen?
This post kommt dem Problem am nächsten, und die Lösung, die von dort funktioniert, ist option(recompile)
(danke, Martin Smith). Dies funktioniert jedoch nicht für mich, da meine Abfragen von meiner ORM-Bibliothek (Entity Framework) generiert werden und ich sie nicht manuell ändern kann.
Eher, was ich suche, ist eine Möglichkeit, die B
Ansicht neu zu formulieren, so dass das Problem nicht auftreten würde.
Beim Hantieren mit diesem Problem habe ich bemerkt, dass immer der "Segment" -Block im Ausführungsplan das Prädikat verliert. Um dies zu überprüfen, habe ich die Abfrage in Form einer Unterabfrage mit der Funktion min
umformuliert (siehe Ansicht). Und voila! - Beide Abfragen gegen die Sicht produzieren identische Pläne.
Die schlechte Nachricht ist jedoch, dass ich nicht diesen min
-gestützte Trick, weil in meinem realen Setup verwenden kann, die Spalte Y
tatsächlich mehrere Spalten sind, so dass ich von ihnen bestellen kann, aber ich kann ein nicht nehmen min()
von ihnen.
Also die zweite Frage wäre: kann jemand mit einem Trick kommen, der Min-powered Unterabfrage ähnelt, aber für mehrere Spalten funktioniert?
HINWEIS 1: Dies ist definitiv nicht auf den Wendepunkt bezogen, da es nur 2 Datensätze in der Tabelle gibt.
HINWEIS 2: es hat auch nicht mit dem Vorhandensein einer Ansicht zu tun. Sehen Sie sich ein Beispiel mit der Ansicht C
an: Der Server verwendet in diesem Fall glücklich die Suche.
Auf meiner lokalen 2008 R2-Instanz 'wählen * aus B, wobei X = @ eine Option (rekompilieren)' erzeugt eine Suche. –
@Martin Smith: Richtig. Verpasst das. Vielen Dank. Leider funktioniert das jedoch nicht ganz. Siehe mein Update zu der Frage. –
Ziemlich wahrscheinlich ein Duplikat: http://dba.stackexchange.com/questions/12498/window-functions-cause-awful-execution-plan-when-called-from-a-view-with-externa – GSerg