Warum generiert NHibernate parametrisiertes SQL genauso schnell wie eine gespeicherte Prozedur?

StackOverflow https://stackoverflow.com/questions/50346

  •  09-06-2019
  •  | 
  •  

Frage

Einer meiner Kollegen behauptet, dass parametrisiertes SQL, das aus einem ORM generiert wird, auf keinen Fall so schnell ist wie eine gespeicherte Prozedur, obwohl der Ausführungspfad zwischengespeichert ist.Irgendeine Hilfe bei diesem hartnäckigen Entwickler?

War es hilfreich?

Lösung

Ich würde damit beginnen, diesen Artikel zu lesen:

http://decipherinfosys.wordpress.com/2007/03/27/using-stored-procedures-vs-dynamic-sql-generated-by-orm/

Hier ist ein Geschwindigkeitstest zwischen den beiden:

http://www.blackwasp.co.uk/SpeedTestSqlSproc.aspx

Andere Tipps

Runde 1 – Sie können einen Profiler-Trace starten und die Ausführungszeiten vergleichen.

Für die meisten Menschen besteht der beste Weg, sie zu überzeugen, "ihnen den Beweis zu zeigen". In diesem Fall würde ich ein paar grundlegende Testfälle erstellen, um denselben Datensatz abzurufen, und dann, wie lange es dauert, wie lange es dauert, mit gespeicherten Verfahren im Vergleich zu NHibernate.Sobald Sie die Ergebnisse haben, übergeben Sie sie ihnen und die meisten Skeptiker sollten sich den Beweisen beugen.

Ich möchte Robs Antwort nur ein paar Dinge hinzufügen:

Stellen Sie zunächst sicher, dass die in den Testfällen enthaltene Datenmenge den Produktionswerten ähnelt.Mit anderen Worten: Wenn Ihre Abfragen normalerweise Tabellen mit Hunderttausenden oder Zeilen betreffen, erstellen Sie eine solche Testumgebung.

Zweitens: Machen Sie alles andere gleich, bis auf die Verwendung einer von nHibernate generierten Abfrage und eines s'proc-Aufrufs.Hoffentlich können Sie den Test durch einen einfachen Anbieterwechsel durchführen.

Bedenken Sie schließlich, dass in der Regel viel mehr auf dem Spiel steht als nur gespeicherte Prozeduren vs.ORM.Vor diesem Hintergrund sollte der Test alle Faktoren berücksichtigen:Ausführungszeit, Speicherverbrauch, Skalierbarkeit, Debugging-Fähigkeit usw.

Das Problem hierbei ist, dass Sie die Beweislast übernommen haben.Es ist unwahrscheinlich, dass Sie jemandes Meinung auf diese Weise ändern.Ob es Ihnen gefällt oder nicht, Menschen – sogar Programmierer – sind einfach zu emotional, um sich leicht von der Logik beeinflussen zu lassen.Sie müssen ihm die Beweislast zurückgeben – ihn dazu bringen, Sie vom Gegenteil zu überzeugen – und das wird ihn dazu zwingen, selbst Nachforschungen anzustellen und die Antwort herauszufinden.

Ein besseres Argument für die Verwendung gespeicherter Prozeduren ist die Sicherheit.Wenn du benutzt nur gespeicherte Prozeduren, mit NEIN Dynamic SQL können Sie die Berechtigungen SELECT, INSERT, UPDATE, DELETE, ALTER und CREATE für den Anwendungsdatenbankbenutzer deaktivieren.Dies schützt Sie vor den meisten SQL-Injections zweiter Ordnung, während parametrisierte Abfragen nur gegen Injektionen erster Ordnung wirksam sind.

Messen Sie es, aber in einem Nicht-Mikro-Benchmark, d. h.etwas, das reale Vorgänge in Ihrem System darstellt.Selbst wenn es für eine gespeicherte Prozedur einen geringfügigen Leistungsvorteil gäbe, wäre dieser im Vergleich zu den anderen Kosten, die Ihrem Code entstehen, unbedeutend:tatsächliches Abrufen von Daten, Konvertieren, Anzeigen usw.Ganz zu schweigen davon, dass die Verwendung gespeicherter Prozeduren darauf hinausläuft, Ihre Logik über Ihre App zu verteilen Und Ihre Datenbank ohne nennenswerte Versionskontrolle, Unit-Tests oder Refactoring-Unterstützung in letzterer.

Benchmarken Sie es selbst.Schreiben Sie eine Testbed-Klasse, die eine gespeicherte Beispielprozedur einige hundert Mal ausführt, und führen Sie den NHibernate-Code genauso oft aus.Vergleichen Sie die durchschnittliche und mittlere Ausführungszeit jeder Methode.

Genauso schnell geht es, wenn die Abfrage jedes Mal die gleiche ist.SQL Server 2005 speichert Abfragepläne auf der Ebene jeder Anweisung in einem Stapel zwischen, unabhängig davon, woher die SQL stammt.

Der langfristige Unterschied könnte darin bestehen, dass gespeicherte Prozeduren für einen DBA um ein Vielfaches einfacher zu verwalten und zu optimieren sind, während Hunderte verschiedener Abfragen, die aus Profiler-Traces ermittelt werden müssen, ein Albtraum sind.

Ich hatte diesen Streit schon oft.
Fast immer schnappe ich mir am Ende einen wirklich guten Datenbankadministrator, führe einen Proc und einen Teil des Codes aus, während der Profiler läuft, und veranlasse den Datenbankadministrator, zu zeigen, dass die Ergebnisse so nahe beieinander liegen, dass sie vernachlässigbar sind.

Messe Es.

Wirklich, jede Diskussion zu diesem Thema ist wahrscheinlich sinnlos, bis Sie es gemessen haben.

Möglicherweise liegt er mit dem konkreten Anwendungsfall, an den er denkt, richtig.Eine gespeicherte Prozedur wird für einen komplexen SQL-Satz, der beliebig optimiert werden kann, wahrscheinlich schneller ausgeführt.Etwas, das Sie jedoch durch Dinge wie den Ruhezustand erreichen, ist das Caching.Dies kann sich während der gesamten Lebensdauer Ihrer tatsächlichen Anwendung als viel schneller erweisen.

Die zusätzliche Abstraktionsebene führt dazu, dass es langsamer ist als ein reiner Sproc-Aufruf.Allein aufgrund der Tatsache, dass Sie über zusätzliche Zuweisungen auf dem verwalteten Heap und zusätzliche Pushs und Pops vom Callstack verfügen, ist es in Wahrheit effizienter, einen Sproc aufzurufen, als die Abfrage von einem ORM erstellen zu lassen, unabhängig davon, wie gut dieser ist ORM ist.

Wie langsam, wenn es überhaupt messbar ist, ist fraglich.Dies wird auch durch die Tatsache unterstützt, dass die meisten ORMs über einen Caching-Mechanismus verfügen, um die Abfrage überhaupt nicht durchzuführen.

Selbst wenn die gespeicherte Prozedur 10 % schneller ist (was wahrscheinlich nicht der Fall ist), möchten Sie sich vielleicht fragen, wie wichtig sie wirklich ist.Was am Ende wirklich zählt, ist, wie einfach es ist, Code für Ihr System zu schreiben und zu warten.Wenn Sie eine Web-App programmieren und Ihre Seiten alle in 0,25 Sekunden zurückkehren, ist die zusätzliche Zeitersparnis durch die Verwendung gespeicherter Prozeduren vernachlässigbar.Allerdings kann die Verwendung eines ORM wie NHibernate viele zusätzliche Vorteile mit sich bringen, die nur mit gespeicherten Prozeduren nur äußerst schwer zu duplizieren wären.

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