2010-11-23 18 views
22

Ich habe viel über Ausführungspläne und die Probleme dynamischer Parameter in gespeicherten Prozeduren gelesen. Ich kenne die vorgeschlagenen Lösungen dafür.SQL Server: Tabellenwertfunktionen vs. gespeicherte Prozeduren

Meine Frage ist, dass alles, was ich gelesen habe, angegeben hat, dass SQL Server den Ausführungsplan für gespeicherte Prozeduren zwischenspeichert. Tabellenwertfunktionen werden nicht erwähnt. Ich gehe davon aus, dass dies für Views (aus Interesse) geschieht.

Wird es jedes Mal neu kompiliert, wenn eine Tabellenwertfunktion aufgerufen wird?

Wann ist es am besten, eine Tabellenwertfunktion im Gegensatz zu einer gespeicherten Prozedur zu verwenden?

+0

mögliches Duplikat von [Funktionen vs. Gespeicherte Prozeduren] (http://stackoverflow.com/questions/178128/functions-vs-stored-procedures) –

+0

Diese Frage wurde vor 3 Jahren gestellt und beantwortet. Was ist der Zweck, es zu schließen, selbst wenn es sich um ein Duplikat handelt? – IamIC

Antwort

25

Eine Inline-Tabellenwertfunktion (TVF) ähnelt einem Makro: Sie wird in die äußere Abfrage erweitert. Es hat keinen Plan als solches: das aufrufende SQL hat einen Plan.

Eine Multi-Anweisung TVF hat einen Plan (wird eine Referenz finden).

TVFs sind nützlich, wenn Sie die SELECT-Liste für einen parametrisierten Eingang ändern möchten. Inline-TVFs werden erweitert und die äußere Auswahl/Wo wird vom Optimierer berücksichtigt. Für Multi-Statement-TVFs ist die Optimierung nicht wirklich möglich, da sie bis zum Abschluss ausgeführt werden muss, dann Filter.

Persönlich würde ich eine gespeicherte Proc über eine Multi-Anweisung TVF verwenden. Sie sind flexibler (zB Hinweise, können den Status ändern, SET NOCOUNT ON, SET XACTABORT usw.).

Ich habe keine Einwände gegen Inline-TVFs, tendiere jedoch nicht dazu, sie für Client-Code zu verwenden, da SET nicht verwendet werden kann und der Status nicht geändert werden kann.

+0

Wow, also ist das Endergebnis nur Stored Procedures Cache-Ausführungspläne, und sind daher die effizienteste Methode der Abfrage von Daten, sogar Ansichten zu schlagen. – IamIC

+1

@IanC: Ansichten auch Cache (wie Inline TVFs). Gespeicherte Procs sind einfach viel flexibler (zB wenn ich SET NOCOUNT EIN, SET XACTABORT + TRY/CATCH) möchte – gbn

+0

Ich benutze Multi-Statement TVFs für verschiedene parametrisierte Eingabe, mit der "OPTION \t (OPTIMIZE FÜR (@JobID UNKNOWN. ...)) inclusion.Ist das optimal? – IamIC

0

Ich habe das nicht verifiziert, aber ich nehme an, dass der Ausführungsplan für Funktionen ebenfalls zwischengespeichert wird. Ich sehe keinen Grund, warum das nicht möglich wäre.

Der Ausführungsplan für Sichten wird jedoch nicht zwischengespeichert. Die Abfrage in der Sicht ist Teil der Abfrage, die die Sicht verwendet, sodass der Ausführungsplan für die Abfrage zwischengespeichert werden kann, die die Sicht verwendet, jedoch nicht für die Sicht selbst.

Die Verwendung von Funktionen versus gespeicherten Prozeduren hängt davon ab, welches Ergebnis Sie daraus benötigen. Eine Tabellenwertfunktion kann ein einzelnes Ergebnis zurückgeben, während eine gespeicherte Prozedur ein Ergebnis, viele Ergebnisse oder überhaupt kein Ergebnis zurückgeben kann.

+0

Eine Sache, die ich bemerkte, ist, dass ich Funktionen nicht "OPTIMIEREN FÜR UNBEKANNT" hinzufügen kann, was mich denken lässt, dass es null und nichtig ist. – IamIC

Verwandte Themen