2009-06-16 1 views
2

Hier ist ein Argument für SPs, die ich noch nicht gehört habe. Flamers, seien Sie vorsichtig mit dem Abwärts Tick,Ist dies ein wichtiger Vorteil der Verwendung von Embedded SQL über gespeicherte Prozeduren?

Da Overhead mit jeder Reise zum Datenbankserver verbunden ist, würde ich vorschlagen, dass ein möglicher Grund für die Platzierung Ihrer SQL in SP über eingebetteten Code ist, dass Sie isolierter sind, um zu ändern ohne einen Performance-Hit zu nehmen.

Zum Beispiel. Angenommen, Sie müssen Abfrage A ausführen, die eine skalare Ganzzahl zurückgibt.

Dann später ändern sich die Anforderungen und Sie entscheiden, dass es die Ergebnisse des Skalars> x ist, dass dann und nur dann müssen Sie eine andere Abfrage durchführen. Wenn Sie die erste Abfrage in einem SP ausgeführt haben, können Sie das Ergebnis der ersten Abfrage einfach überprüfen und die zweite SQL-Anweisung im selben SP ausführen.

Wie würden Sie dies effizient in Embedded SQL machen, ohne eine separate Abfrage oder eine unnötige Abfrage durchzuführen?

Hier ist ein Beispiel:

--This SP may return 1 or two queries. 

SELECT @CustCount = COUNT(*) FROM CUSTOMER 

IF @CustCount > 10 
    SELECT * FROM PRODUCT 

Kann das/was ist der beste Weg, dies in Embedded SQL zu tun?

Antwort

7

A very persuasive article

SQL und gespeicherte Prozeduren werden für die Dauer Ihrer Daten da sein.

Client-Sprachen kommen und gehen, und Sie müssen Embedded SQL jedes Mal neu implementieren.

+0

Ich wünschte, ich könnte dich mehr als einmal für diesen Artikel abstimmen. Überzeugende Punkte, die ich noch nicht gehört habe. – ChadD

+0

SQL ändert nicht, ob es in eine andere Sprache eingebettet ist oder nicht. Und auf jeden Fall sollten Sie versuchen, das benutzerdefinierte SQL, das Sie so oft wie möglich schreiben, zu minimieren. http://www.losetechies.com/blogs/chad_myers/archive/2008/02/21/sql-is-the-assembly-language-of-the-modern-world.aspx – chadmyers

+0

@ chadmyers: wenn Sie arbeiten größere Systeme, ORMs scheitern kläglich. Und sie können nicht mit richtig gestalteten Datenbanken umgehen, weil sie Ihnen das Design vorschreiben. Und es macht meine Antwort nicht ungültig, weil Sie das ORM jedes Mal neu implementieren müssen. Ein gespeicherter Prozess ist eine Methode – gbn

0

Wie würden Sie das tun effizient in Embedded SQL w/o eine separate Abfrage oder eine unnötige Abfrage durchführen?

Hängt von der Datenbank ab, die Sie verwenden. In SQL Server ist dies eine einfache CASE Anweisung.

+0

Wie wäre es mit einem Embedded SQL-Beispiel? Siehe das SQL-Snippet, das ich der Frage hinzugefügt habe. – ChadD

+0

Ihr Snippet macht keinen Sinn, da eine Abfrage einen Skalar und die andere eine Tabelle zurückgibt. Sollte die zweite Abfrage nicht auch einen Skalar liefern? – RedFilter

+0

Ich verstehe nicht, warum diese Unterscheidung relevant ist. Könnten Sie bitte erklären? – ChadD

1

Ich würde in der Regel nie Geschäftslogik in SP setzen, ich mag sie in meiner Muttersprache der Wahl außerhalb der Datenbank zu sein. Das einzige Mal, wenn ich zustimme, dass SPs besser sind, ist, wenn es eine Menge Datenbewegungen gibt, die nicht aus der db kommen müssen.

Um Ihre Frage zu beantworten, hätte ich lieber zwei Abfragen in meinem Code, als diese in einem SP einzubetten. Aus meiner Sicht trade ich einen kleinen Performance-Hit für etwas viel deutlicher.

0

umfassen Vielleicht die WHERE-Klausel in diesem sproc:

WHERE (all your regular conditions) 
AND myScalar > myThreshold 
+0

hmm. Ich möchte die ersten SQL-Ergebnisse nicht ändern. Ich möchte den 2. Sehen Sie sich die bearbeitete Originalfrage an, die ein kleines SQL-Beispiel enthält. – ChadD

0

Vorteile von SPs:

  1. Leistung (vorkompiliert)
  2. Einfach zu ändern (ohne die Anwendung zu kompilieren)
  3. SQL Satz basierte Funktionen machen sehr einfach
wirklich schwierig, Daten Aufgaben zu tun

Nachteile:

  1. stark von der Datenbank-Engine verwendet Depend
  2. macht den Einsatz von Upgrades ein wenig schwieriger (Sie haben die App + die Skripte bereitstellen)

My 2 Cents ..., es

Über Ihr Beispiel kann wie folgt geschehen:

select * from products where (select count(*) from customers>10) 
+1

"Leistung (sind vorkompiliert)" Das war mit SQL Server 7, weniger so mit Sql Server 2000, nicht existent mit Sql Server 2005. 2008, würde ich betteln zu unterscheiden das Gegenteil ist wahr. – mxmissile

+0

@mxmissile, interessanter Punkt, ich werde es überprüfen, das ist, was ich über SO jeden Tag mag, lernen Sie eine Menge ... – tekBlues

+0

SQL Server 2005/2008 macht Ausführungsplan Caching für beide Sprocs und regelmäßige Abfragen, behandelt sie als im Wesentlichen die gleich. "Der Hauptleistungsvorteil, den gespeicherte Prozeduren und Trigger in SQL Server gegenüber Stapeln von dynamischem SQL haben, besteht darin, dass ihre SQL-Anweisungen immer dieselben sind." Quellen [http://msdn.microsoft.com/en-us/library/ms190201.aspx] und [http://msdn.microsoft.com/en-us/library/ms181055.aspx] Allerdings bin ich nicht Sicher, wie du das Gegenteil sagen kannst. –

2

Sie bieten im Beispiel die Zeitersparnis einen einzelnen skalaren Wert und eine einzige Follow-up-Abfrage über den Draht sendet. Dies ist in keinem vernünftigen Szenario von Bedeutung. Das bedeutet nicht, dass es möglicherweise keine anderen gültigen Leistungsgründe für die Verwendung von SPs gibt. nur, dass dies kein Grund ist.

+0

Ist es immer unbedeutend? Ich würde denken, dass, wenn Sie zwei separate SQL von einem Webserver zu einer Datenbank ausführen, wo die Rohrleitung zwischen ihnen optimiert ist, dass dies unbedeutend sein kann, aber dass diese Vorkommen im Laufe der Zeit vervielfältigen können Sie mit einer langsamen App, aber Was ist, wenn Sie mit einem fetten Kunden zu tun haben? – ChadD

+0

Ich denke, es ist immer unbedeutend. Wenn die Auslösezeit für einen Skalar und eine Abfragezeichenfolge einen wesentlichen Teil des Abfrageausführungszyklus darstellt, ist Ihre Abfrage zu klein (Sie verwenden beispielsweise eine 1000-equals-Abfrage anstelle einer IN-Abfrage oder eine erneute Abfrage für jede Zeile) in einem Ergebnissatz usw.) Wenn Sie einen Fall haben, in dem dies zu erheblichen Einsparungen führt, gibt es andere, größere Probleme mit Ihrem System. –

+0

Meine Perspektive ist, dass es einfach teuer ist, einen Server zum Ausführen einer Abfrage zu springen, unabhängig von der ausgeführten SQL. Wenn Sie einen fetten Client haben, wie würden Sie erwarten, dass der Client mit der db spricht? Direkt oder über einen Webservice eines bestimmten Typs? Wenn das letztere, reden wir nicht über zwei Hopfen? 1) vom Fat Client zum Webserver und 2) vom Webserver zur Datenbank? Ich finde, dass jeder Hop (abgesehen von der Abfragezeit) größtenteils weniger als eine Sekunde dauert, aber meine allgemeine Erfahrung in unserem Unternehmen ist, dass das Netzwerk ziemlich langsam ist, und dennoch kann die nwetwk-Infrastruktur jederzeit wechseln. – ChadD

0

In letzter Zeit bevorzuge ich es, SPs nicht zu verwenden (außer wenn Komplexität entsteht, wo ein Proc einfach besser wäre ... oder CLR wäre besser). Ich habe das Repository-Muster mit LINQ to SQL verwendet, wo meine Abfrage in einem stark typisierten LINQ-Ausdruck in meine Datenschicht geschrieben wird. Der Schlüssel hier ist, dass die Abfrage stark typisiert ist, was bedeutet, dass wenn ich refactor ich Refactoring Eigenschaften einer Klasse, die direkt aus der Datenbanktabelle generiert wird (die Änderungen von der DB durchgeführt durchgeführt den ganzen Weg super einfach und genau macht). Während mein SQL für mich generiert und an den Server gesendet wird, habe ich immer noch die Möglichkeit, die DRY-Prinzipien beizubehalten, da das Repository-Muster es mir erlaubt, die Dinge in ihre kleinste Komponente aufzuteilen. Ich habe das Problem, dass ich eine Reise zum Server machen könnte und basierend auf den Ergebnissen der Abfrage kann ich feststellen, dass ich eine weitere Reise zum Server machen muss. Ich mache mir darüber keine Sorgen. Wenn ich später feststelle, dass es ein Problem wird, dann kann ich diesen Code in etwas performanter gestalten. Der Schlüssel hier ist, dass es keine magische Kugel gibt. Ich tendiere dazu, auf Greenfield-Anwendungen zu arbeiten, wodurch diese Entwicklungsmethode für mich am effizientesten ist.

+0

LINQ intrigiert mich, obwohl ich abgesehen von Hello World Beispielen es nicht benutzt habe. Für mich ist der stark bindende Teil sehr ansprechend. Die Anziehungskraft von LINQ mag für mich ausreichen, um mich von SPs wegzuführen, aber ich bin vorsichtig mit der Idee, dass "wenn die Dinge später zu einem Problem werden, sie umstrukturiert werden können". – ChadD

+0

Wenn Sie eine gute Trennung von Bedenken haben (z. B. ein Repository-Muster), kennt Ihre Anwendung keine gespeicherten Prozeduren, Inline-SQL, LINQ to SQL, NHibernate, Entity Framework, XML usw. Das einzige Problem, das ich bei der Verwendung von LINQ to SQL habe oder Entity Framework ist, dass sie keine truley POCO-Klassen verwenden (obwohl EF näher ist). Dies ist ein akzeptabler Kompromiss für mich, da es den Arbeitsaufwand reduziert. NHibernate bietet dies wirklich gut, wenn Sie es benötigen! Dies macht die Umgestaltung einer Technologie ziemlich einfach. Das und Verwendung von StructureMap überall! –

Verwandte Themen