Ist es besser, eine gespeicherte Prozedur zu verwenden oder die alte Methode mit einer Verbindungszeichenfolge und all dem guten Zeug zu machen? Unser System läuft in letzter Zeit langsam und unser Manager möchte, dass wir versuchen zu sehen, ob wir die Dinge etwas beschleunigen können und wir überlegten, einige der alten Datenbankaufrufe auf gespeicherte Prozeduren umzustellen. Lohnt es sich?
Als Erstes prüfen Sie, ob in der Datenbank alle erforderlichen Indizes eingerichtet sind. Analysieren Sie, wo der Code langsam ist, und untersuchen Sie die entsprechenden SQL-Anweisungen und Indizes. Prüfen Sie, ob Sie die SQL-Anweisung neu schreiben können, um effizienter zu sein. Stellen Sie sicher, dass Sie keine SQL-Anweisung (vorbereitete Anweisung) für jede Iteration in einer Schleife neu kompilieren, sondern nur einmal.
Das Verschieben einer SQL-Anweisung in eine Stored Procedure wird nicht helfen, wenn sie in der Implementierung grob ineffizient ist. Die Datenbank wird jedoch wissen, wie SQL am besten optimiert wird, und es muss nicht wiederholt ausgeführt werden. Es kann auch den clientseitigen Code sauberer machen, indem eine komplexe SQL-Anweisung in einen einfachen Prozeduraufruf umgewandelt wird.
Ich würde einen kurzen Blick auf Gespeicherte Prozeduren sind EVIL .
Solange Ihre Aufrufe konsistent sind, speichert die Datenbank den Ausführungsplan (sowieso MS SQL). Der stärkste verbleibende Grund für die Verwendung gespeicherter Prozeduren ist die einfache und sichere Sicherheitsverwaltung.
Wenn ich Sie wäre, würde ich zuerst nach Indizes suchen, falls erforderlich. Führen Sie auch ein Profiling -Tool aus, um zu prüfen, was lange dauert, und ob sql geändert werden muss, z. Hinzufügen weiterer Where-Klauseln oder Einschränken der Ergebnismenge.
Sie sollten Caching in Erwägung ziehen, wo Sie können.
Gespeicherte Prozeduren machen die Dinge nicht schneller.
Die Neuordnung Ihrer Logik wird jedoch große Auswirkungen haben. Die aufgeräumten, fokussierten Transaktionen, die Sie entwickeln, wenn Sie an gespeicherte Prozeduren denken, sind von großem Vorteil.
Außerdem neigen gespeicherte Prozeduren dazu, Bind-Variablen zu verwenden, wobei andere Programmiersprachen manchmal darauf angewiesen sind, SQL-Anweisungen im laufenden Betrieb zu erstellen. Ein kleiner fester Satz von SQL-Anweisungen und Bindevariablen ist schnell. Dynamische SQL-Anweisungen sind langsam.
Eine Anwendung, die in letzter Zeit "langsam läuft", benötigt keine Kodierungsänderungen.
Messen. Messen. Messen. "langsam" bedeutet nicht viel, wenn es um Performance-Tuning geht. Was ist langsam? Welche genaue Transaktion ist langsam? Welcher Tisch ist langsam? Fokus.
Kontrolliere alle Änderungen. Alle. Was hat sich geändert? Betriebssystem-Patch? RDBMS ändern? Anwendungsänderung? Etwas hat sich geändert, um die Dinge zu verlangsamen.
Überprüfen Sie, ob Einschränkungen in der Skalierung vorhanden sind. Verlangsamt sich eine Tabelle, weil 80% der Daten die Historie sind, die Sie für die Berichterstellung einmal pro Jahr verwenden?
Gespeicherte Prozeduren sind nie die Lösung für Leistungsprobleme, bis Sie absolut auf einen bestimmten Codeblock zeigen können, der nachweislich schneller ist als eine gespeicherte Prozedur.
Gespeicherte Prozeduren können sehr hilfreich sein, wenn sie große Datenmengen vermeiden und / oder Roundtrips auf dem Server vermeiden, damit sie wertvoll sind, wenn Ihre Anwendung eines dieser Probleme hat.
Nachdem Sie Ihre Recherche abgeschlossen haben, werden Sie feststellen, dass es zwei extreme Ansichten auf der gegenüberliegenden Seite des Spektrums gibt. Historisch gesehen war die Java-Community gegen Speicherprozeduren aufgrund der Verfügbarkeit von Frameworks wie Hibernate, umgekehrt hat die .NET-Community mehr gespeicherte Procs verwendet und dieses Vermächtnis reicht bis zu den vb5 / 6 Tagen. Setzen Sie all diese Informationen in einen Kontext und halten Sie sich von den extremen Meinungen auf beiden Seiten der Medaille fern.
Geschwindigkeit sollte nicht der primäre Faktor sein, um sich gegen oder zugunsten von gespeicherten Procs zu entscheiden. Sie können eine Performance erzielen, indem Sie Inline-SQL mit Hibernate und anderen Frameworks verwenden. Erwägen Sie die Wartung und andere Programme wie Berichte, Skripts könnten dieselben gespeicherten Prozeduren verwenden, die von Ihrer Anwendung verwendet werden. Wenn Ihr Szenario mehrere Benutzer für denselben SQL-Code erfordert, sind gespeicherte Prozeduren ein guter Kandidat, die Wartung wird einfacher. Wenn dies nicht der Fall ist und Sie sich dafür entscheiden, inline sql zu verwenden, sollten Sie in den Konfigurationsdateien eine Externalisierung vornehmen, um die Wartung zu erleichtern.
Am Ende des Tages zählt, was Ihr bestimmtes Szenario zu einem Erfolg für Ihre Stakeholder macht.
Wenn Ihr Server in Ihrer Hauptsaison merklich langsamer wird, liegt das vielleicht eher an der Sättigung als an Ineffektivität in der Datenbank. Grundlegende Warteschlangentheorie sagt uns, dass ein Server hyperbolisch langsamer wird, wenn er sich der Sättigung nähert.
Die grundlegende Beziehung ist 1/(1-X)
, wobei X der Anteil der Last ist. Dies beschreibt die durchschnittliche Warteschlangenlänge oder die Wartezeit bis zur Zustellung. Daher wird ein Server, der sich sättigt, sehr schnell verlangsamen, wenn die Last aussetzt.
Ein Server, der zu 25% geladen ist, hat eine durchschnittliche Servicezeit von 1,333 K für eine konstante K (in der Regel ist K die Zeit, in der die Maschine eine Transaktion durchführt). Ein Server, der 50% geladen ist, hat eine durchschnittliche Servicezeit von 2K und ein Server, der zu 90% geladen ist, hat eine durchschnittliche Servicezeit von 10K. Angesichts der Tatsache, dass die Verlangsamungen hyperbolisch sind, erfordert die Gesamtlast oft keine große Veränderung, um eine signifikante Verschlechterung der Reaktionszeit zu verursachen.
Offensichtlich ist dies etwas vereinfacht, da der Server mehrere Anfragen gleichzeitig verarbeitet (es gibt komplexere Warteschlangenmodelle für diese Situation), aber das breite Prinzip gilt immer noch.
Wenn also auf Ihrem Server vorübergehende Lasten auftreten, die ihn sättigen, werden Sie spürbare Verlangsamungen bemerken. Beachten Sie, dass diese Verzögerungen nur in einem eng begrenzten Bereich des Systems liegen müssen, um den gesamten Prozess zu verlangsamen. Wenn Sie dies jetzt nur in einer Hauptsaison erleben, besteht die Möglichkeit, dass Ihr Server einfach eine Einschränkung für eine Ressource getroffen hat, anstatt besonders langsam oder ineffizient zu sein.
Beachten Sie, dass diese Möglichkeit nicht der Möglichkeit von Ineffizienzen im Code entgegensteht. Sie können feststellen, dass die Lösung des Engpasses darin besteht, einige Ihrer Abfragen zu optimieren.
Um festzustellen, ob das System Engpässe aufweist, sollten Sie Profilinformationen sammeln. Wenn Sie Ressourcen mit einer großen Anzahl von Wartezeiten finden können, sollte dies ein guter Ausgangspunkt sein.
Die letzte Möglichkeit besteht darin, dass Sie Ihren Server aktualisieren müssen. Wenn es keine größeren Ineffizienzen im Code gibt (dies kann durchaus der Fall sein, wenn das Profiling keine unverhältnismäßig großen Engpässe anzeigt), benötigen Sie möglicherweise einfach größere Hardware. Ich habe keine Ahnung, was Ihre Volumes sind, aber raten Sie nicht die Möglichkeit, dass Sie aus Ihrem Server herausgewachsen sind.
Ja, Stored Procs ist ein Schritt in Richtung guter Performance. Der Hauptgrund ist, dass gespeicherte Prozeduren vorkompiliert und ihr Ausführungsplan zwischengespeichert werden kann.
Sie müssen jedoch zuerst analysieren, wo Ihre Leistungsengpässe wirklich sind - so dass Sie diese Übung auf strukturierte Weise angehen.
Wie in einer der Antworten vorgeschlagen, versuchen Sie, mit einem Profiler-Tool zu analysieren, wo das Problem liegt - z. B. müssen Sie Indizes erstellen ...
Prost
Wie alle oben genannten Beiträge vorschlagen, möchten Sie zuerst Ihre SQL-Anweisungen bereinigen, entsprechende Indizes haben. Caching kann schwierig sein, kann ich nicht kommentieren, es sei denn, ich habe mehr Details darüber, was Sie erreichen möchten.
Aber eine Sache über Sprocs, stellen Sie sicher, dass Sie nicht generieren dynamische SQL-Anweisungen
weil es zum einen sinnlos ist und zum anderen SQL Injection Attacken ausgesetzt werden kann ... das ist in einem der Projekte passiert, die ich untersucht habe.
Ich würde Sprocs hauptsächlich für Updates empfehlen und dann Anweisungen auswählen. Viel Glück:)
Sie können niemals im Voraus sagen. Sie müssen es tun und den Unterschied messen, denn in 9 von 10 Fällen ist der Engpass nicht wo Sie denken.
Wenn Sie eine gespeicherte Prozedur verwenden, müssen Sie die Daten nicht übertragen. DBs sind normalerweise langsam beim Ausführen von [EDIT] komplexen [/ EDIT] gespeicherten Prozeduren [EDIT] mit Loops, höherer Mathematik, etc [/ EDIT]. Es hängt also wirklich davon ab, wie viel Arbeit Sie benötigen, wie langsam Ihr Netzwerk ist, wie schnell die Datenbank diesen speziellen Code ausführt usw.
Tags und Links performance stored-procedures