Effizienz von gespeicherten Prozeduren im Vergleich zu unformatierten Abfragen

23

Ich habe auf beiden Seiten dieser Debatte viel gelesen: Gibt es einen signifikanten Leistungsgewinn, wenn nur gespeicherte Prozeduren für unformatierte Abfragen verwendet werden? Ich interessiere mich speziell für SQL Server, würde mich aber für alle Datenbanken interessieren.

stimms
quelle
2
Können Sie Links zu dem posten, was Sie gelesen haben? Ich glaube nicht, dass Leistung auf dem Spiel steht (zumindest nicht direkt)
Jack Douglas
1
@JackDouglas, sieh dir die Antwort von mrdenny an. Leistung ist sehr viel ein Teil dieser Frage / Antwort.
Thomas Stringer

Antworten:

31

In SQL Server 2008 und höher ist dies weniger der Fall, aber es ist immer noch vorhanden. Es kommt darauf an, dass der Ausführungsplan-Cache und SQL Server eingehende Abfragen automatisch parametrisieren können. Wenn gespeicherte Prozeduren verwendet werden (die kein dynamisches SQL enthalten), sind die Abfragen bereits parametrisiert, sodass SQL Server dies nicht tut. Es muss kein Plan für jede Abfrage erstellt werden, wenn diese ausgeführt wird, da die Pläne bereits im Plan-Cache gespeichert sind.

Vergessen Sie auch nicht die Sicherheitsprobleme (dynamisches SQL, Mindestberechtigungen usw.), die bei der Verwendung gespeicherter Prozeduren auftreten können.

Wenn die App dynamisches SQL für die Basistabellen verwendet, um die Daten in den Tabellen auszuwählen, einzufügen, zu aktualisieren und zu löschen, muss die Anwendung direkt über Rechte für alle diese Objekte verfügen. Wenn also jemand SQL Injection verwendet, um auf den Server zu gelangen, hat er das Recht, alle Daten in diesen Tabellen abzufragen, zu ändern oder zu löschen.

Wenn Sie gespeicherte Prozeduren verwenden, haben diese nur die Berechtigung, die gespeicherten Prozeduren auszuführen und nur die Informationen abzurufen, die die gespeicherte Prozedur zurückgeben würde. Anstatt eine schnelle Löschanweisung zu erstellen und alles wegzublasen, müssten sie herausfinden, welche Prozeduren zum Löschen von Daten verwendet werden können, und dann herausfinden, wie die Prozedur dazu verwendet wird.

Angesichts der Tatsache, dass SQL Injection der einfachste Weg ist, in eine Datenbank einzudringen, ist dies ziemlich wichtig.

mrdenny
quelle
@mrdenny - können Sie den gleichen Effekt mit "unformatierten Abfragen" erzielen, wenn sie parametrisiert sind?
Jack Douglas
Ja, wenn sie vollständig parametriert sind. Hiermit werden jedoch nicht die Sicherheitsprobleme behoben, die mit gespeicherten Prozeduren behoben werden.
Mrdenny
10

Als Ergänzung zu Dennys Antwort ist es nicht ungewöhnlich, Systeme zu finden, bei denen ein erheblicher Pufferpoolspeicher für Ad-hoc-Ausführungspläne mit einfacher oder geringer Verwendung verschwendet wird, die als Ergebnis von Abfragen erstellt wurden, die über Prozesse hinweg verwendet wurden.

In letzter Zeit schlimmste Fälle: 8 GB für eine Instanz, 3 GB Plan-Cache, 2,5 GB Single Use-Pläne. Die Mehrheit davon war SQL2005, daher war es keine Option, die Optimierung für Ad-hoc-Workloads vorzunehmen.

Es wird sicherlich schwieriger, die Leistung in eine Begründung für Prozeduren über unformatierte Abfragen aufzunehmen. Eines der wichtigsten Argumente für mich ist jetzt: "Wenn Sie Verfahren anwenden, ist es für mich viel einfacher, bei Leistungsproblemen zu helfen." Eine dynamische / linq / orm-Schnittstelle hindert Sie nicht an der Optimierung, kann jedoch Ihre Optionen erheblich einschränken.

Mark Storey-Smith
quelle
Hier finden Sie einen großartigen Artikel, einschließlich Skripten zum Löschen dieser Einwegpläne. sqlskills.com/blogs/kimberly/…
SomeGuy
7

SQL Server speichert und optimiert gespeicherte Prozeduren und Ad-hoc-SQL auf dieselbe Weise. Zum Beispiel diese Prozedur:

create procedure dbo.TestSB(@id int) as select * from Orders where id = @id

Wird optimiert und zwischengespeichert mit:

select * from Orders where id = @id

Das folgende Ad-hoc-SQL kann jedoch aufgrund des fest codierten Werts nicht effektiv zwischengespeichert werden:

select * from Orders where id = 42

Obwohl die Leistung gleich ist, gibt es gute Gründe, gespeicherte Prozeduren zu verwenden. Gespeicherte Prozeduren bieten eine klare Trennung zwischen DBA und Anwendungsentwicklern. Es ist gut, eine zusätzliche Schutzschicht zwischen Ihren wertvollen Daten und sich ständig ändernden Programmen zu haben :)

Andomar
quelle
+1 vor allem, wenn Sie den Zugriff auf alle SPs erzwingen und diese als Transaktions-API und nicht nur als CRUD-Ebene gedacht sind
Jack Douglas
Ab 2008 kann die id = 42Abfrage unter Verwendung desselben Plans in Abhängigkeit von einfachen / erzwungenen Parametrisierungseinstellungen optimiert werden. Natürlich sollten Abfragen richtig parametrisiert werden. :-)
Aaron Bertrand