SQL Server geht im Grunde diese Schritte durch, um any auszuführen Abfrage (Aufruf einer gespeicherten Prozedur oder Ad-hoc-SQL-Anweisung):
1) die Abfrage syntaktisch überprüfen
2) ob sie in Ordnung ist - sie überprüft den Plan-Cache, um zu sehen, ob sie bereits einen Ausführungsplan für diese Abfrage hat
3) ob es einen Ausführungsplan gibt - dieser Plan ist ( wieder-)verwendet und die Abfrage ausgeführt
4) wenn noch kein Plan vorhanden ist, wird ein Ausführungsplan bestimmt
5) dieser Plan wird zur späteren Wiederverwendung im Plan-Cache gespeichert
6) der Abfrage wird ausgeführt
Der Punkt ist:Ad-hoc-SQL und gespeicherte Prozeduren sind nicht anders .
Wenn eine Ad-hoc-SQL-Abfrage Parameter ordnungsgemäß verwendet - was ohnehin der Fall sein sollte, um SQL-Injection-Angriffe zu verhindern - sind ihre Leistungsmerkmale nicht anders und definitiv nicht schlechter als eine gespeicherte Prozedur auszuführen.
Gespeicherte Prozeduren haben andere Vorteile (z. B. muss Benutzern kein direkter Tabellenzugriff gewährt werden), aber in Bezug auf die Leistung ist die Verwendung richtig parametrisierter Ad-hoc-SQL-Abfragen genauso effizient wie die Verwendung gespeicherter Prozeduren.
Aktualisierung: Verwenden gespeicherter Prozeduren über nicht parametrisiert Abfragen ist aus zwei Hauptgründen besser:
-
da jede nicht parametrisierte Abfrage eine neue, andere ist Abfrage an SQL Server, muss es alle Schritte zur Bestimmung des Ausführungsplans für jede Abfrage durchlaufen (wodurch Zeit verschwendet wird - und auch Platz im Plan-Cache, da das Speichern des Ausführungsplans im Plan-Cache am Ende nicht wirklich hilft , da diese bestimmte Abfrage wahrscheinlich nicht wird erneut ausgeführt werden)
-
nicht parametrisierte Abfragen sind dem Risiko eines SQL-Injection-Angriffs ausgesetzt und sollten um jeden Preis vermieden werden