4 Stimmen

Inline-SQL versus gespeicherte Prozedur

Ich habe eine einfache SELECT Anweisung mit ein paar Spalten, auf die in der WHERE Klausel. Normalerweise erledige ich diese einfachen Aufgaben im VB-Code (Einrichten eines Command-Objekts, Einstellen von Command Type auf Text, Einstellen von Command Text auf die Select-Anweisung). Ich sehe jedoch Timeout-Probleme. Wir haben so ziemlich alles, was wir können, mit unseren Tabellen usw. optimiert.

Ich frage mich, ob es eine große Leistung Hit, nur weil ich die Abfrage auf diese Weise tun, versus Erstellen einer einfachen gespeicherten Prozedur mit ein paar Parameter sein würde. Ich denke, vielleicht der Inline-Code zwingt SQL zusätzliche Arbeit zu tun, Kompilieren, Erstellen von Abfrageplan usw., die nicht auftreten würde, wenn ich eine gespeicherte Prozedur verwendet.

Ein Beispiel für die tatsächliche Ausführung von SQL:

SELECT TOP 1 * FROM MyTable WHERE Field1 = @Field1 ORDER BY ID DESC

5voto

marc_s Punkte 701497

Eine gut formulierte "Inline"- oder "Ad-hoc"-SQL-Abfrage - wenn sie richtig mit Parameter - ist genauso gut wie eine gespeicherte Prozedur.

Aber das ist ganz entscheidend : Sie müssen richtig parametrisierte Abfragen verwenden! Wenn Sie das nicht tun - wenn Sie Ihr SQL für jede Anfrage zusammenfügen - dann werden Sie nicht von diesen Punkten profitieren...

Genau wie bei einer gespeicherten Prozedur muss bei der ersten Ausführung ein Ausführungsplan für die Abfrage gefunden werden - und dieser Ausführungsplan wird dann im Plan-Cache zwischengespeichert - genau wie bei einer gespeicherten Prozedur.

Dieser Abfrageplan wird immer wieder verwendet, wenn Sie Ihre parametrisierte Inline-SQL-Anweisung mehrfach aufrufen - und der "Inline"-SQL-Abfrageplan unterliegt denselben Cache-Evakuierungsrichtlinien wie der Ausführungsplan einer gespeicherten Prozedur.

Nur unter diesem Gesichtspunkt - wenn Sie wirklich richtig verwenden parametrisiert Abfragen - es gibt keinen Leistungsvorteil für eine gespeicherte Prozedur.

Gespeicherte Prozeduren haben noch andere Vorteile (z. B. als "Sicherheitsgrenze" usw.), aber die reine Leistung ist nicht einer ihrer Hauptvorteile.

0voto

Ray Punkte 21047

Es stimmt, dass die Datenbank die von Ihnen erwähnte zusätzliche Arbeit leisten muss, aber das sollte nicht zu einem großen Leistungseinbruch führen (es sei denn, Sie führen die Abfrage sehr, sehr häufig aus )

Verwenden Sie den Sql-Profiler, um zu sehen, was tatsächlich an den Server gesendet wird. Verwenden Sie den Aktivitätsmonitor, um festzustellen, ob Ihre Abfrage durch andere Abfragen blockiert wird.

0voto

bbsimonbb Punkte 23637

Ihre Anfrage könnte nicht einfacher sein. Ist Feld1 indiziert? Wie andere bereits gesagt haben, gibt es keine Leistungseinbußen bei "Ad-hoc"-Abfragen.

Dies ist eine der ältesten Debatten in der Technik, wenn es um die Frage geht, wohin man seine Anfragen stellen soll. Ich würde argumentieren, dass Ihre Anfragen zu Ihrer Anwendung "gehören". Sie werden mit Ihrer Anwendung versioniert, mit Ihrer Anwendung getestet und sollten verschwinden, wenn Ihre Anwendung verschwindet. Sie irgendwo anders als in Ihrer Anwendung zu platzieren, bedeutet, sich in eine Welt des Schmerzes zu begeben. Aber um Himmels willen, verwenden Sie .sql-Dateien, kompiliert als eingebettete Ressourcen.

0voto

user11022700 Punkte 1

Select-Anweisung, die Teil der Formularklausel eines beliebigen einer anderen Anweisung ist, wird als Inline-Abfrage bezeichnet. Kann keine Parameter annehmen. Kein Datenbankobjekt

Verfahren: Kann Parameter annehmen Datenbank-Objekt kann global verwendet werden, wenn dieselbe Aktion durchgeführt werden muss.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X