Verwendung von gespeicherten Prozeduren für die Berechnungen
Ich arbeite derzeit an einem Projekt zum speichern der spezifischen finanziellen, Informationen über unsere Kunden in einer MS SQL-Datenbank. Später, unsere Nutzer müssen in der Lage sein, um die Datenbank Abfragen, um die Daten von den Kunden, basierend auf bestimmten Kriterien (zB. clients, die größer als eine bestimmte Größe, Kunden in einem bestimmten geografischen Gebiet) und insgesamt es als benchmark verwenden. Die Datenbank zugegriffen wird, die von unserem Finanz-software über ein Skript.
Ich bin derzeit am schreiben der gespeicherten Prozeduren für die Datenbank. Was ich bin der Planung auf dem tun ist und schreibt mehrere unterschiedliche gespeicherte Prozeduren auf der Basis der verschiedenen Arten von Kriterien verwendet werden können. Sie werden den client zurück zahlen.
Die eigentliche Frage die ich habe ist auf die Methode zum abrufen der Daten. Ich brauche mehrere verschiedene Berechnungen mit Daten des Kunden. Ist es eine bessere Praxis, um verschiedene gespeicherte Prozeduren für die Berechnung auf der Grundlage der client-Anzahl und das Ergebnis zurückgibt, oder ist es besser, einfach eine gespeicherte Prozedur zurückgeben, alle Informationen über den client, und führen Sie die Berechnungen im Skript?
Performance könnte ein Problem sein, weil es viele Kunden in der Datenbank, so will ich die Methode, die einigermaßen effizient.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es hängt wirklich davon ab, die Vorgänge. Es ist durchaus möglich, diese Dinge als berechnete Spalten in der Datenbank, haben Sie pre-berechnet in Aussicht oder SPs (oder den Einsatz von UDFs), müssen Sie separat berechnet und gespeichert, während der ETL-oder eine Zusammenfassung phase oder lassen Sie den Kunden es tun.
Ich würde vermeiden, dass der Kunde nichts tun, es sei denn, Sie wissen, können Sie Steuern die Berechnung konsequent, so dass Sie nicht einen Fehler machen (Bericht Schriftsteller, die all die Arbeit tun, unabhängig ist ein Rezept für ein desaster), und vor allem, wenn sich die Berechnungsgrundlagen ändern könnte.
Interessant, die data-warehouse-Leute tun dies die ganze Zeit. Sie verwenden oft die einfachste mögliche SQL - (SELECT SUM/COUNT... GROUP BY...) und die Arbeit außerhalb der Datenbank im Berichts-writing-tools.
Ich denke, Sie sollten eine Kopie des Data Warehouse Toolkit und sehen, wie dies getan werden kann, in einer Weise, dass ist schon ein bisschen einfacher. flexibler und wahrscheinlich besser skalierbar.
Ich denke, eine Menge davon hat zu tun mit der die Daten und die Operationen, die Sie tun. Ich in der Regel feststellen, dass, wenn die Berechnungen, die die Größe der Rückkehr aus der DB (Gruppierungen und Aggregate), dass es viel effektiver ist, um es in die DB. Wie Sie beginnen zu tun, anderen Berechnungen es ist nicht so eindeutig obwohl.
In den meisten Fällen wie die, die ich denke die du beschreibst, ist es effizienter gespeicherte Prozeduren verwenden, jedoch gibt es Grenzfälle, wo es nicht. Die beste Antwort wäre, es zu versuchen beide Wege und führen Sie einige Tests, um zu bestimmen, die für bestimmte, welche Methode am effizientesten ist.
SQL Server ist eine Relationale DataStore. Ich schlage vor, eine Gespeicherte Prozedur, die pro Berechnung, die nicht die gleiche Berechnung für einen Kunden. Geben Sie einfach die ID als parameter, um die Kunden spezifische Ergebnis.
"Performance könnte ein Problem sein, weil es eine Menge von Kunden"....dies hängt davon ab, wie die Tabellen sind normalisiert und indexiert. Nicht gehen, Indizierung jeder Spalte, es sei denn, Sie verstehen, was Indizes wirklich sind.
Edit ~ Schau in Ihre Berechnungen. Einige abgeladen werden können, um front-end-clients.
Es klingt aus deiner Frage, dass der effizienteste Weg wäre, um alle Berechnungen in der SP und kehren dem einzigen(?) Ergebnis zu deinem Skript.
Wenn Sie sich entscheiden, um die Verarbeitung im Skript sollten Sie sicherstellen, dass Sie die Daten einschränken, die Sie abrufen nur, was notwendig ist, und stellen Sie sicher, dass Sie als paar round-trips zur Datenbank, wie möglich.
Wenn die business-Regeln, die bestimmen das Ergebnis sind anfällig für ändern, nicht code so in stored procedures. Zu einem besseren Ort zu tun, so wäre der controller (C in MVC). Die Vorschriften sind steckbar und einfach zu ändern.
Auch von einer Skalierbarkeit Sicht duplizieren der app-Server ist nicht so teuer wie das duplizieren von Datenbank-Servern.
Das bedeutet nicht, dass gespeicherte Prozeduren nicht verwendet werden, wenn. Report generation wäre ein Idealer Kandidat für die Datenverarbeitung erfolgt mithilfe von gespeicherten Prozeduren.
Überlegen Sie, ob Sie brauchen, um havea data warehouse. Eine Datenbank, optimiert für die Berichterstattung ist ganz anders, aus einer Datenbank, optimiert für die Eingabe von Daten.
Alles, was Sie sagen, führt mich zu denken, sollten Sie überlegen, Lagerung Ihrer Daten. Wenn Sie finden, sich selbst zu schreiben über komplexe joins gegen ein OLTP-system und benötigen zusätzliche Berechnungen (und es klingt wie Sie sind), denormalizing Ihre Daten ein und speichern Sie die vorausberechneten Aggregationen in einer Lagerhalle wird Ihr Leben viel einfacher.
Trotz der enormen Menge an Büchern und Produkten, die jeder scheint zu wollen, um zu werfen Sie, wenn Ihr problem Raum diskret ist und Ihre Quelldaten ist gut gelungen, die Aufgabe ist oft trivial.
Können Sie eine Berechnung in der gespeicherten Prozedur und die Daten zurückgeben. Verzinsung wie die gespeicherte Prozedur müssen viele Berechnungen.
Irgendeiner Weise, die Sie haben, berechnen von Daten mit anderen Tabelle Daten.
SUMME können wir tun, SP,
-- auch declare @A, @B usw
Wie pro Ihre Anforderung können Sie geben Zustand.
ISNULL für die überprüfung, ob Daten ist NULL dann 0 zurück. Berechnung mit dem Wert Null nicht möglich ist, also bessere geben ISNULL Zustand.
Hier Sowohl aggregierte und nicht aggregierte Funktionen sind da, also müssen Sie der Gruppe Durch.
Sie können Werte wie pro Ihre Bedingung wie z.B.: "Wo SUM(C)>0". Auch können Sie hier nach Group By.
Verwendung für finden Sie die Anzahl der Tage mit dieser Funktion.
Können Sie Bedingungs-wie,
Wie Berechnungen, die Sie tun können in der Gespeicherten Prozedur.
Wenn Sie wollen, um Berechnungen mit der Anzahl der Datensätze, die nacheinander dann können Sie eine temporäre Tabelle, while Schleife..
Wie Sie alles tun können mit der Gespeicherten Prozedur.