Frage

Ich habe eine Webanwendung, bei der die Webserver- und SQL Server 2008-Datenbank auf verschiedenen Boxen auf derselben Serverfarm sitzen.

Wenn ich eine monolithische gespeicherte Prozedur einnehme und in mehrere kleinere gespeicherte Procs auftrappen, wodurch der Clientcode für Anrufe auf mehrere gespeicherte Prozeduren anstelle von nur einer verantwortlich ist, und ich merke einen erheblichen Leistung Meine Webanwendung?


Zusätzliche Hintergrundinfo:

Ich habe eine gespeicherte Prozedur mit mehreren hundert Codezeilen mit Entscheidungslogik, Aktualisierungsanweisungen und schließlich eine SELECT-Anweisung, die einen Datensatz an den Client zurückgibt.

Ich muss ein Stück Funktionalität in meinen Client-Code einfügen (in diesem Sinne ist der Client-Code der ASP-Webserver, der den Datenbankserver anruft), der eine Komponenten-DLL anruft. Die gespeicherte Prozedur wird jedoch aktualisiert, um ein Recordset zu aktualisieren und die updierten Daten in denselben Anruf zurückzugeben, und mein Code muss idealerweise aufgerufen werden nach Die Entscheidungslogik und Aktualisierungsanweisungen werden aufgerufen, aber vor < / em> Die Daten werden an den Client zurückgegeben.

Um diese Funktionalität zu arbeiten, muss ich wahrscheinlich den vorhandenen gespeicherten PROC in mindestens zwei Teile aufteilen: ein gespeicherter PROC, der die Datenbank aktualisiert, und einen anderen, der Daten aus der Datenbank abruft. Ich würde dann meinen neuen Code zwischen diesen gespeicherten PROP-Anrufen einfügen.

Wenn ich dieses Problem anschaue, kann ich nicht anders als um zu denken, dass aus einem Sicht der Code-Wartung viel besser ist, um alle meines Updates zu isolieren und Aussagen in dünn auszuwählen gespeicherte Procs und verlassen die Geschäftslogik dem Clientcode. Wann immer ich, wenn ich die Funktionalität oder Entscheidungslogik in meinen Kundencode einfügen muss, ist alles, was ich tun muss, um den Client-Code zu ändern, anstatt einen riesigen gespeicherten Proc zu modifizieren.

Wenn die Verwendung von dünnen gespeicherten Procs möglicherweise besser von einem Code-Wartungspunkt der Ansicht sein könnte, wie viel Leistungsschmerz erleben Sie, indem ich die Anzahl der Reisen in die Datenbank erhöht? Das Nettoergebnis an die Daten ist das gleiche, aber ich berühre die Datenbank häufiger. Wie wirkt sich dieser Ansatz auf die Leistung aus, wenn der Antrag auf die Bedarfsbedarf skaliert wird?

Ich bin nicht eins, um die Leistungsoptimierung über alles andere zu platzieren, insbesondere wenn er die Wartung der Code betrifft, aber ich möchte mich nicht im Fuß erschießen und Kopfschmerzen erstellen, wenn die Webanwendung skaliert wird.

War es hilfreich?

Lösung

Im Allgemeinen sollten Sie in der Regel in der Regel um ein Minimum an SQL Server an SQL Server herstellen.

Der "Treffer" auf dem Server ist sehr teuer, es ist eigentlich teurer, denselben Betrieb in 3 Teilen zu wenden, dann 1 Treffer und alles andere auf dem Server.

In Bezug auf die Wartung können Sie 1 gespeicherte PROC vom Client anrufen, wobei der Proc proc eine weitere 2-Procs-Anrufe anruft.

Ich hatte einen Antrag mit extremer Suchlogik, das ist das, was ich getan habe, um es umzusetzen.

Einige Benchmarking-Ergebnisse ... Ich hatte einen Kundennrein, der Server fiel, und er bröckte, als wir auf das Problem markierten, als wir auf das Problem markierten, dass es viele Rundrissen an SQL Server waren, als wir es minimierten, kamen die Server wieder normal.

Andere Tipps

es wirkt sich darauf aus.Wir verwenden einen Weblogic-Server, in dem sich die gesamte Geschäftslogik im Appserver befindet, die mit einer DB / 2-Datenbank verbunden ist.Wir verwenden meistens Entity-Bohnen in unserem Projekt und machen für die meisten Business-Service-Anrufe mehrere Ausflüge in die DB ohne sichtbare Nebenwirkungen.(Wir stimmen einige Abfragen ein, um bei Bedarf mehr Tabelle zu sein).

Es hängt wirklich von Ihrer App ab.Sie müssen Benchmark benötigen.

Ein Gut-Setup-SQL-Server auf gute Hardware kann viele Tausende von Transaktionen pro Sekunde verarbeiten.

Tatsächlich kann eine große gespeicherte Prozedur von Vorteil sein, da Sie nur einen zwischengespeicherten Abfrageplan pro Charge haben können.Einbruch in mehrere Chargen bedeutet, dass sie jeweils ihren eigenen Abfrageplan erhalten.

Sie sollten auf jeden Fall auf der Seite der Code-Wartung erraten, aber Benchmark, um sicherzugehen.

In Anbetracht dessen, dass die Query-Plan-Landschaft einkennt, sollten Sie ALOS bereit sein, um Ihre Indizes zu aktualisieren, vielleicht verschiedene Abdeckindizes erstellen.

Im Wesentlichen ist diese Frage eng mit enger vs. losen Kupplung verbunden.

Zu Beginn: Sie können immer die monolithische gespeicherte Prozedur annehmen und in mehrere kleinere gespeicherte Procs aufteilen, , die alle von einer gespeicherten Prozedur aufgerufen werden , wodurch der Clientcode nur für den Anruf verantwortlich isteine gespeicherte Prozedur.

Es sei denn, der Client wird etwas unternimmt (ändern Sie die Daten oder geben Sie den Status an den Benutzer an)eine erhebliche Leistungssteigerung.

In jedem Fall würde ich es benahmen und von dort anpassen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top