2016-03-27 3 views
0

Ich habe eine Tabelle, die Kategorien in einem geschachtelten Mengenmodell verwaltet, und bei jeder neuen Zeileneinfügung muss die gesamte Tabelle aktualisiert werden.Welche ist schneller beim Einfügen von Zeilen: SQL Server gespeicherte Prozedur oder C# Server Side Code?

Für Performance-Probleme, möchte ich, wenn es besser wissen:

  • schreiben Trigger und Stored Procedures, die auf Zeileneinfügungen Feuer und die Tabelle

ODER

  • verwalten Schreibe C# -Methoden, die von der Haupteinfügefunktion aufgerufen werden?
+0

Ich würde denken, dass es in SQL wäre schneller, als wäre es eine Reise weniger. Kann aber nicht 100% sagen. – Tim

+0

Wenn Sie viele Zeilen einfügen, empfehle ich BulkInsert in C#. – Shyju

+0

Der Hauptvorteil der Verwendung einer gespeicherten Prozedur besteht darin, dass Sie jeder Zeile eine eindeutige ID hinzufügen können, die beim Erstellen der ID-Nummer aus C# nicht möglich ist. Die gespeicherte Prozedur ist normalerweise schneller, da der SQL-Server die SQL-Zeichenfolge effizienter analysiert als die Netzwerkbibliothek. – jdweng

Antwort

1

Es gibt keine richtige Antwort auf diese Frage. Im Allgemeinen ist Code, der in einer gespeicherten Prozedur enthalten ist, schneller als Code von ADO.NET.

Das gesagt, gespeicherte Prozeduren und Trigger haben zwischengespeicherte Ausführungspläne (also Ad-hoc-Abfragen von ADO.NET, aber sie arbeiten ein bisschen anders). Ausführungspläne sind grundsätzlich Straßenkarten für welche Algorithmen der SQL-Server zum Ausführen von Join-Vorgängen verwenden sollte. Wenn eine gespeicherte Prozedur oder ein Trigger komplexer wird, wird der Ausführungsplan komplexer. Eine einzelne komplexe gespeicherte Prozedur kann abhängig von den an sie übergebenen Parametern auch mehr als einen Ausführungsplan enthalten. Was passieren kann, wenn eine gespeicherte Prozedur sehr komplex wird, ist, dass der SQL-Server beginnen kann, suboptimale Ausführungspläne zu wählen, die wirklich schrecklich funktionieren, und Ihr Code kann plötzlich sehr, sehr langsam werden. Wenn dies geschieht, ist der ADO.NET-Code schneller, da es sich normalerweise um mehrere kleine Ausführungspläne statt um einen großen handelt.

Im Allgemeinen, wenn ich eine Situation wie Ihre habe, werde ich wählen, gespeicherte Prozeduren zu verwenden, die nur ein paar Dinge tun. Wenn Sie mehr und mehr Aktualisierungen vornehmen müssen, wenn sich Ihre Geschäftsanforderungen ändern und Ihre gespeicherte Prozedur länger und länger wird, empfiehlt es sich, diese Prozedur in mehrere Prozeduren zu gliedern.

Ich würde die Trigger vollständig überspringen. Trigger machen es sehr schwierig, über ein System nachzudenken. Sie sind fast unmöglich zu debuggen, und das Setup für Überraschungen auf dem Weg.

Es ist ein bisschen ein Code-Geruch, dass Sie die gesamte Tabelle aktualisieren müssen, wenn eine Zeile eingefügt wird. Wenn diese Einsätze häufig auftreten, werden Sie schreckliche Leistungsprobleme haben. Ich würde nach einer Möglichkeit suchen, Ihre Daten besser zu normalisieren, damit dies möglichst nicht passieren muss.

+2

'Code in einer gespeicherten Prozedur ist schneller als Code aus ADO.NET' Dies ist in keiner Weise wahr. Die Ausführung wird genau die gleichen Schritte ausführen und die Leistung wird gleich sein.Das einzige Argument, das Sie machen können, ist, dass die Übertragung einer längeren SQL-Zeichenfolge einige Mikrosekunden mehr benötigt. – usr

+0

Vielen Dank für Ihre Antwort. Leider ist die Logik des Nested-Set-Modells sehr dynamisch. Besteuerung bei Schreibvorgängen, aber schneller bei Lesevorgängen als bei einem üblichen hierarchischen Baummodell. – Mikahel

+0

Ich behaupte nicht, dass gespeicherte Prozeduren schneller sind, weil sie magisch bessere Ausführungspläne haben. Sie sind schneller, weil sie die Anzahl der Hin- und Rückfahrten in die Datenbank reduzieren, bis sie langsamer sind, weil sie sehr komplex sind. –

Verwandte Themen