Ich muss einige einfache Funktionen wie hisisisides, binäre Schritte, Sigmoids und verschiedene Tangenten wiederholt über einige Sätze von SQL Server-Daten ausführen. Ich habe oft gehört, dass es effizient ist, irgendwelche Mengen und Aggregate, die in solchen Funktionen verwendet werden, durch T-SQL abzuleiten, aber ineffizient, um Funktionen dieser Art wiederholt in T-SQL auszuführen. Nach dem, was ich gelesen habe, würde die Verwendung von T-SQL zu diesem Zweck nach dem populären Begriff des SQL-Server-Gurus Jeff Moden als "RBAR" -Operation oder als "Row by Agonizing Row" gelten. In verschiedenen Artikeln, die im Internet verstreut sind, habe ich oft gelesen, dass solche Funktionen in C# oder VB.Net implementiert werden sollten, aber ich bin mir nicht sicher, wie ich das genau machen und trotzdem RBARs vermeiden kann. Kann mir jemand einige Best Practices für die Verwendung von .Net-Sprachen zu diesem Zweck nennen? Dies wirft einige eng verwandte Fragen auf:Wie kann CLR anstelle von T-SQL-Funktionen gehebelt werden, um RBARs zu vermeiden?
1) Kann ich dies effizient in CLR-Funktionen tun?
2) Wäre es effizienter, C# - oder VB.Net-Arrays in solchen Funktionen zu verwenden und sie massenweise ganze Datenmengen zu liefern?
3) Wie kann ich RBARs in einem solchen Design vermeiden, wenn ich die CLR-Funktionen noch einmal für jeden Datensatz im Satz aufrufen muss, genau wie bei einer normalen SQL Server-Funktion?
4) Sollte diese Logik stattdessen in Objekten der mittleren Ebene erfasst und Daten über das Netzwerk eingespeist werden?
5) Wenn ich solche Funktionen den ganzen Tag in gelegentlichen Batches ausführen muss, kann ich stattdessen ein C# - oder VB.net-Programm auf der Serverseite ausführen und es einfach kontinuierlich mit Daten versorgen? Diese Lösung könnte mit # 2 einhergehen, aber ich denke, sie könnte die Serverstabilität beeinträchtigen, wenn sie zu viel Speicher/CPU/IO außerhalb der Kontrolle von SQL Server verbrauchen würde.
Die ganze Stoßrichtung dieser Fragen ist hauptsächlich auf ein Ziel gerichtet: Den effizientesten Weg zu finden, um RBARs zu vermeiden, wenn diese Funktionen ausgeführt werden. Wenn es eine andere Methode gibt, sie zu vermeiden, die ich nicht erwähnt habe, lass es mich wissen. Ich weiß bereits, wie man einige RBARs vermeidet, indem ich T-SQL verwende, um Aggregate und Set-basierte Lösungen zu erstellen, aber ich frage mich, ob ich andere eliminieren kann, die direkt mit den wiederholenden Funktionsaufrufen in Verbindung stehen. Die beste Vorgehensweise scheint zu sein, .Net anstelle von SQL Server-Funktionen zu verwenden, um dies zu erreichen, aber ich bin unscharf, wie man das in der Praxis implementiert. Jede Hilfe würde bei der Klärung dieser Design-Entscheidung für mich geschätzt werden.
Analytische Funktionen sind der Schuldige hier. Können Sie keine Tabellenfunktion verwenden? Casting und Conversions sind geringe Kosten für die Ausführung mehrerer Abfragen pro Zeile. Sind Sie sicher, dass dies immer noch ein relationales Anliegen ist? Dann benutze SQL. Ist dies kursiv, dann verwenden Sie eine geeignete Methode (wie.Net, obwohl SQL seine eigenen Methoden hat). Ich denke, ich verstehe nicht, wie du "einfache" Berechnungen hast, wenn das, was du sagst, wahr ist. –
Ja, es ist definitiv relational, dass ich einige komplizierte Sätze ableiten muss, bevor ich diese einfachen mathematischen Funktionen anwende (wie verschiedene Steps und Sigmoids, zum Beispiel das logistische Funktion - siehe https://en.wikipedia.org/wiki/Logistic_function) für jede Zeile. Der Grund, warum ich keine Tabellenfunktionen dafür verwende, ist, dass ich die mathematischen Funktionen noch einmal für jede Zeile (ein RBAR) ausführen muss, damit es für mich überhaupt nicht optimiert wird. Ich kann meine eigene logistische Funktion in T-SQL leicht programmieren, aber ich habe gehört, dass es effizienter wäre, solche Dinge in C# oder VB.Net zu tun. – SQLServerSteve
Ich könnte verwirrt sein. Ich meinte relationale Datensätze. Mengenlehre. T-SQL verfügt über kursive Operationen (einschließlich XQuery. OPENXML verwendet Sätze), aber es ist wahrscheinlich effizienter, eine kursive Sprache für die kursive Logik zu verwenden. –