it-swarm.com.de

SQL-Server-Leistung: Was ist schneller, eine gespeicherte Prozedur oder eine Ansicht?

Was ist schneller in SQL Server 2005/2008, einer gespeicherten Prozedur oder einer Ansicht?

EDIT: Wie viele von Ihnen darauf hingewiesen haben, bin ich zu vage. Lassen Sie mich versuchen, etwas genauer zu sein.
Ich wollte den Leistungsunterschied für eine bestimmte Abfrage in einer Ansicht im Vergleich zu derselben Abfrage in einer gespeicherten Prozedur kennen. (Ich schätze immer noch alle Antworten, die auf ihre unterschiedlichen Fähigkeiten hinweisen.)

35
7wp

Stored Procedures (SPs) und SQL Views sind verschiedene "Biester", wie in diesem Beitrag mehrfach angegeben.

Wenn wir einige [normalerweise geringfügige, mit Ausnahme von Randfällen] Leistungsaspekte ausschließen, die mit dem Zwischenspeichern des Abfrageplans verbunden sind, ist die Zeit, die mit dem Binden an eine gespeicherte Prozedur und dergleichen verbunden ist , die beiden Ansätze im Großen und Ganzen äquivalent, in Bezug auf die Leistung. Allerdings ...

Eine Sicht ist auf alles beschränkt, was in einer einzelnen SELECT-Anweisung ausgedrückt werden kann (naja, möglicherweise mit CTEs und ein paar anderen Tricks), aber im Allgemeinen ist eine Sicht an deklarative Formen von Abfragen gebunden . Auf der anderen Seite kann eine gespeicherte Prozedur verschiedene prozedurale Konstrukte (sowie deklarative) verwenden. Infolgedessen kann man mit SPs übergeben -Stellen Sie eine Methode zum Lösen einer bestimmten Abfrage her, die effizienter ist als das, was der Abfrageoptimierer von SQL-Server möglicherweise getan hat (basierend auf einer einzelnen deklarativen Abfrage). In diesen Fällen kann ein SP viel schneller sein (aber Vorsicht, der Optimierer ist ziemlich schlau und es ist nicht viel erforderlich, einen SP viel langsamer als die entsprechende Ansicht zu machen.)

Abgesehen von diesen Leistungsaspekten sind die SPs vielseitiger und ermöglichen ein breiteres Spektrum an Abfragen und Aktionen als die Ansichten.

69
mjv

Leider sind sie nicht die gleiche Art von Tier. 

Eine gespeicherte Prozedur besteht aus einer Reihe von T-SQL-Anweisungen und CAN-Rückgabedaten. Es kann alle Arten von Logik ausführen und gibt nicht notwendigerweise Daten in einem Resultset zurück.

Eine Ansicht ist eine Darstellung von Daten. Sie wird meistens als Abstraktion einer oder mehrerer Tabellen mit darunter liegenden Joins verwendet. Es ist immer eine Ergebnismenge von null, einer oder mehreren Zeilen.

Ich habe den Verdacht, dass Ihre Frage eher in die Richtung geht:

Was ist schneller: SELECTing aus einer Sicht oder die entsprechende SELECT-Anweisung in einer gespeicherten Prozedur, wenn dieselben Basistabellen verwendet werden, die die Joins mit denselben where-Klauseln ausführen?

12
p.campbell

Dies ist keine wirklich zu beantwortende Frage, da eine Antwort in allen Fällen zutreffen wird. Als allgemeine Antwort auf eine SQL Server-spezifische Implementierung ...

Im Allgemeinen bietet eine gespeicherte Prozedur eine gute Chance, schneller zu sein als eine direkte SQL-Anweisung, da der Server alle möglichen Optimierungen durchführt, wenn eine gespeicherte Prozedur gespeichert und beim ersten Mal ausgeführt wird. 

Eine Ansicht ist im Wesentlichen eine gespeicherte SQL-Anweisung.

Daher würde ich sagen, dass eine gespeicherte Prozedur im Allgemeinen schneller als eine Ansicht ist, WENN die SQL-Anweisung für beide gleich ist und wenn die SQL-Anweisung von Optimierungen profitieren kann. Ansonsten wären sie in der Regel ähnlich.

Verweisen Sie auf diese Linkdokumentation, die meine Antwort unterstützt.

http://www.sql-server-performance.com/tips/stored_procedures_p1.aspx

http://msdn.Microsoft.com/de-de/library/ms998577.aspx

Wenn Sie nach allen Möglichkeiten zur Optimierung der Leistung unter SQL Server suchen, ist der zweite Link oben ein guter Anfang.

8
David

Ich bevorzuge gespeicherte Prozeduren wegen der besseren Kontrolle der Daten. Wenn Sie ein gutes, sicheres modulares System erstellen und gespeicherte Prozeduren verwenden möchten, können mehrere SQL-Befehle ausgeführt werden, die Anweisungen zum Steuern des Flusses enthalten und Parameter akzeptieren. Alles, was Sie in einer Ansicht tun können, können Sie in einer gespeicherten Prozedur tun. In einer gespeicherten Prozedur können Sie jedoch wesentlich flexibler arbeiten.

5
RRUZ

Kurz gesagt, basierend auf meinen Erfahrungen mit einigen komplexen Abfragen bietet Stored Procedure eine bessere Leistung als Funktion.

Sie können jedoch keine Ergebnisse einer gespeicherten Prozedur in Auswahl- oder Verknüpfungsabfragen verwenden.

Wenn Sie die Ergebnismenge nicht in einer anderen Abfrage verwenden möchten, verwenden Sie besser SP.

Der Rest der Details und Unterschiede wird von Leuten in diesem Forum und anderswo erwähnt.

4
Tejasvi Hegde

Gespeicherte Prozeduren und Ansichten sind unterschiedlich und dienen unterschiedlichen Zwecken. Ich betrachte Ansichten als Dosenabfragen. Ich betrachte gespeicherte Prozeduren als Codemodule.

Angenommen, Sie haben eine Tabelle namens tblEmployees mit diesen beiden Spalten (ua): DateOfBirth und MaleFemale

Eine Sicht namens viewEmployeesMale, die nur männliche Mitarbeiter herausfiltert, kann sehr nützlich sein. Eine Ansicht namens viewEmployeesFemale ist auch sehr nützlich. Beide Ansichten sind selbstbeschreibend und sehr intuitiv.

Nehmen wir an, Sie müssen eine Liste aller männlichen Angestellten im Alter zwischen 25 und 30 Jahren erstellen. Zwar könnte man es ganz sicher als Ansicht betrachten, aber meiner Meinung nach eignet sich eine gespeicherte Prozedur besser, um damit umzugehen. Datumsmanipulationen, insbesondere wenn Nullen ein Faktor sind, können sehr schwierig werden.

Ich glaube, dass eine andere Denkweise darin besteht, gespeicherte Prozeduren zur Auswahl der Ansichten zu verwenden. Dadurch wird Ihre Architektur zu einem lose verbundenen System. Wenn Sie sich entscheiden, das Schema in der Zukunft zu ändern, müssen Sie sich nicht 'so' sorgen, dass es das Frontend durchbricht. 

Ich denke, was ich sage, ist statt sp vs Ansichten, denke sp und Ansichten :)

3
JustinT

Ein paar andere Überlegungen: Während die Leistung zwischen einem SP und einer Ansicht im Wesentlichen gleich ist (vorausgesetzt, dass sie genau dieselbe Auswahl ausführen), bietet SP mehr Flexibilität für dieselbe Abfrage.

  • Das SP unterstützt die Anordnung der Ergebnismenge. d. h. einschließlich einer ORDER BY-Anweisung. Sie können dies nicht in einer Ansicht tun.
  • Das SP ist vollständig kompiliert und erfordert nur einen Exec, um es aufzurufen. Die Ansicht erfordert weiterhin einen SELECT * FROM view, um sie aufzurufen. d. h. eine Auswahl der kompilierten Auswahl in der Ansicht.
0
IronRod

Eine detaillierte Leistungsanalyse wurde gefunden: https://www.scarydba.com/2016/11/01/stored-procedures-not-faster-views/

Kompilierungszeitvergleich:

Es gibt einen Unterschied in der Kompilierungszeit zwischen der Ansicht für sich und den gespeicherten Prozeduren (sie waren fast identisch). Schauen wir uns die Leistung über einige tausend Ausführungen an:

Ansicht AVG: 210.431431431431

Gespeicherter Prozess mit Ansicht AVG: 190.641641641642

Gespeichertes Verfahren AVG: 200.171171171171

Dies wird in Mikrosendern gemessen. Die Abweichung, die wir sehen, ist wahrscheinlich nur eine Ungleichheit bei E/A, CPU oder etwas anderem, da die Unterschiede bei 10 mc oder 5% trivial sind.

Wie sieht es mit der Ausführungszeit einschließlich der Kompilierungszeit aus, da es einen Unterschied gibt:

Abfragedauer Anzeigen AVG: 10089.3226452906

Gespeichertes Verfahren AVG: 9314.38877755511

Gespeicherter Prozess mit Ansicht AVG: 9938.05410821643

Fazit :

Mit Ausnahme der Unterschiede in der Kompilierungszeit sehen wir, dass Ansichten tatsächlich genauso wie gespeicherte Prozeduren ausgeführt werden, wenn die fragliche Abfrage identisch ist.

0
Nabster

Ich weiß, ich sollte das nicht in eine "Diskussion" verwandeln, aber ich bin sehr daran interessiert und denke nur, ich würde meine empirischen Beobachtungen zu einer bestimmten Situation teilen, mit besonderem Hinweis auf alle obigen Kommentare, in denen das gesagt wird Eine äquivalente SELECT-Anweisung, die innerhalb einer gespeicherten Prozedur und einer View ausgeführt wird, sollte im Wesentlichen dieselbe Leistung aufweisen.

Ich habe eine Ansicht in Datenbank "A", die 5 Tabellen in einer separaten Datenbank (DB "B") verbindet. Wenn ich in SSMS und SELECT * aus der Ansicht eine Datenbank mit "A" anhebe, dauert es> 3 Minuten, um 250000 Zeilen zurückzugeben. Wenn ich die select-Anweisung von der Entwurfsseite der Ansicht nehme und direkt in SSMS ausführe, dauert es <25 Sekunden. Wenn Sie dieselbe select-Anweisung in eine gespeicherte Prozedur einfügen, wird dieselbe Leistung erzielt, wenn Sie diese Prozedur ausführen.

Ohne auf die absolute Leistung eingehen zu wollen (db "B" ist eine AX-Datenbank, die wir nicht berühren dürfen!), Bin ich dennoch absolut überzeugt, dass die Verwendung eines SP in diesem Fall eine Größenordnung schneller ist als Verwenden einer Ansicht zum Abrufen der gleichen Daten. Dies gilt in diesem Fall auch für viele andere ähnliche Ansichten.

Ich denke nicht think es ist etwas mit dem Herstellen einer Verbindung zur anderen Datenbank zu tun, es sei denn, durch die Verwendung einer Sicht kann die Verbindung irgendwie zwischengespeichert werden, wohingegen das select dies tut, da ich zwischen den beiden selects wechseln kann dasselbe SSMS-Fenster wiederholt, und die Leistung jeder Abfrage bleibt konstant. Wenn ich mich direkt mit db "B" verbinde und das select ohne dbname.dbo .... refs starte, dauert es auch dieselbe Zeit.

Irgendwelche Gedanken?

0
Ade