2008-09-08 17 views

Antwort

5

Für die meisten Menschen ist der beste Weg zu überzeugen um ihnen den Beweis zu zeigen. In diesem Fall würde ich einige grundlegende Testfälle erstellen, um denselben Datensatz abzurufen, und dann die Zeit, die für die Verwendung gespeicherter Prozeduren im Vergleich zu NHibernate benötigt wird. Sobald Sie die Ergebnisse haben, übergeben Sie es ihnen und die meisten skeptischen Menschen sollten den Beweisen nachgeben.

8

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

1

Messen Sie es, aber in einem Nicht-Mikro-Benchmark, d. H. Etwas, das reale Operationen in Ihrem System darstellt. Selbst wenn es einen winzigen Leistungsvorteil für eine gespeicherte Prozedur geben würde, ist sie unbedeutend gegenüber den anderen Kosten, die der Code verursacht: Daten abrufen, konvertieren, anzeigen, usw. Nicht zu vergessen, dass die Verwendung von gespeicherten Prozeduren zur Verbreitung Ihrer Logik führt über Ihre App und Ihre Datenbank mit keinen signifikanten Versionskontrolle, Komponententests oder Refactoring-Unterstützung in letzterem.

+0

Ich habe meine gesamte DB unter Quellcodeverwaltung effectivley mit VSTS DB Edition. Ich denke, in der Vergangenheit hätte ich vielleicht zugestimmt, aber die Werkzeuge holen auf. – JoshBerke

1

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

1

Es ist genauso schnell, wenn die Abfrage jedes Mal gleich ist. Sql Server 2005 zwischenspeichert Abfragepläne auf der Ebene jeder Anweisung in einem Batch, unabhängig davon, woher die SQL stammt. Der Langzeitunterschied könnte darin bestehen, dass gespeicherte Prozeduren für einen DBA viel einfacher zu verwalten und abzustimmen sind, während Hunderte von verschiedenen Abfragen, die aus Profiler-Traces ermittelt werden müssen, ein Albtraum sind.

1

Ich hatte dieses Argument schon oft.
Fast immer am Ende greife ich eine wirklich gute dba, und läuft ein Proc und ein Stück Code mit dem Profiler ausgeführt wird, und die dba zu zeigen, dass die Ergebnisse so nahe sind, ist es vernachlässigbar.

+0

Richtig, es sei denn, Sie haben viel Logik eingebaut. Zum Beispiel, wenn Sie eine Schleife, die eine Reihe von Rechnungen zieht, dann für jede Rechnung aktualisiert die Rechnung Zeilen auf der Grundlage einiger Kriterien, wird es fast definitiv schneller als ein proc ... einfach, weil es die SELECTed Daten nicht über die Leitung schieben muss. –

+0

Updates in einer Schleife, mit Nhibernate, sind schneller, weil es nicht auf dem Draht 1 auf einmal sendet. wo als eine Schleife in einem Proc ist sehr ineffizient. – DevelopingChris

0

Messen Sie es.

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

0

Er kann für den spezifischen Anwendungsfall richtig sein, er denkt. Eine gespeicherte Prozedur wird wahrscheinlich schneller für einige komplexe SQL-Sätze ausgeführt, die beliebig angepasst werden können. Etwas, das Sie aus Dingen wie Ruhezustand bekommen, ist Caching. Dies kann sich viel schneller für die Lebensdauer Ihrer tatsächlichen Anwendung erweisen.

2

Das Problem hier ist, dass Sie die Beweislast akzeptiert haben. Du wirst es wahrscheinlich nicht ändern. Ob es ihm gefällt oder nicht, Menschen - sogar Programmierer - sind einfach zu emotional, um leicht von der Logik beeinflusst zu werden. Sie müssen ihm die Beweislast zurückgeben - ihn dazu bringen, Sie anders zu überzeugen - und das wird ihn zwingen, die Forschung zu machen und die Antwort für sich selbst zu finden.

Ein besseres Argument für die Verwendung gespeicherter Prozeduren ist die Sicherheit. Wenn Sie nur gespeicherte Prozeduren mit keine dynamische SQL verwenden, können Sie die Berechtigungen SELECT, INSERT, UPDATE, DELETE, ALTER und CREATE für den Benutzer der Anwendungsdatenbank deaktivieren. Dies schützt Sie vor der SQL Injection 2. Ordnung, während parametrisierte Abfragen nur bei der Injektion erster Ordnung wirksam sind.

+0

Ich mag deine Taktik. Du hast Recht - überzeugende Menschen, die die Beweislast selbst akzeptieren, werden dich nirgendwohin bringen. –

5

Ich würde nur ein paar Dinge zu Robs Antwort hinzu:

Stellen Sie zunächst sicher, dass die Datenmenge in den Testfällen beteiligt ist ähnlich zu Produktionswerten. Anders ausgedrückt, wenn Ihre Abfragen normalerweise gegen Tabellen mit Hunderttausenden oder Zeilen gerichtet sind, erstellen Sie eine solche Testumgebung.

Zweitens, machen Sie alles andere gleich, außer für die Verwendung einer nHibernate generierten Abfrage und eines s'proc Aufrufs. Hoffentlich können Sie den Test ausführen, indem Sie einfach einen Provider austauschen.

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

0

Die zusätzliche Abstraktionsebene bewirkt, dass sie langsamer ist als ein reiner Aufruf an einen Sproc. Allein aufgrund der Tatsache, dass Sie zusätzliche Zuweisungen auf dem verwalteten Heap und zusätzliche Pushs und Pops vom Callstack haben, ist es wahrscheinlicher, dass es effizienter ist, einen Sproc aufzurufen, wenn ein ORM die Abfrage erstellt, egal wie gut ORM ist.

Wie langsam, wenn es sogar messbar ist, ist umstritten. Dies wird auch durch die Tatsache unterstützt, dass die meisten ORMs einen Caching-Mechanismus aufweisen, um zu vermeiden, dass die Abfrage überhaupt durchgeführt wird.

0

Auch wenn die gespeicherte Prozedur 10% schneller ist (ist es wahrscheinlich nicht), möchten Sie sich vielleicht fragen, wie wichtig es wirklich ist. Was am Ende wirklich zählt, ist, wie einfach es ist, Code für Ihr System zu schreiben und zu pflegen. Wenn Sie eine Webanwendung codieren und Ihre Seiten alle in 0,25 Sekunden zurückgegeben werden, ist die durch die Verwendung gespeicherter Prozeduren eingesparte zusätzliche Zeit vernachlässigbar. Es kann jedoch viele zusätzliche Vorteile der Verwendung eines ORM wie NHibernate geben, was extrem schwierig wäre, nur gespeicherte Prozeduren zu duplizieren.