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

Tabellenwertfunktion tötet meine Abfrageleistung

Die Rückgabe einer Tabellenvariablen macht sie zu einer Tabellenwertfunktion mit mehreren Anweisungen und kann aufgrund der Tatsache, dass es wie eine Tabelle behandelt wird, schlecht für die Leistung sein, außer dass SQL Server keine Statistiken zur Verfügung stellt, auf denen ein guter Ausführungsplan basieren könnte. Daher schätzt es, dass die Funktion eine sehr kleine Anzahl von Zeilen zurückgibt. Wenn es eine größere Anzahl von Zeilen zurückgibt, könnte der generierte Plan daher viel weniger als optimal sein.

Wenn Sie nur ein SELECT zurückgeben, wird es zu einer inline-Tabellenwertfunktion - Betrachten Sie es eher als Aussicht. In diesem Fall werden die eigentlichen zugrunde liegenden Tabellen in die Hauptabfrage gebracht und ein besserer Ausführungsplan kann basierend auf geeigneten Statistiken generiert werden. Sie werden feststellen, dass in diesem Fall der Ausführungsplan die Funktion überhaupt NICHT erwähnt, da die Funktion im Grunde nur in die Hauptabfrage eingefügt wurde.

Es gibt eine großartige Referenz dazu auf MSDN von CSS SQL Server Engineers einschließlich (Zitat):