2012-04-13 5 views
0

Ich muss alle Datenzeilen in der Tabelle validieren, sobald eine neue Zeile eingefügt wird.Validierungsfunktionalität innerhalb von SQLCLR und seiner Leistung

DETAILS: Jede Zeile, die in die Tabelle eingefügt wird, sollte eine Reihe von Validierungsregeln durchlaufen. Diese Regeln können je nach Daten innerhalb der Zeile variieren. Wenn in C# geschrieben wird, sieht es wie kleine Anwendung aus. Anstatt es als separate Anwendung zu schreiben, plane ich daher, es als SQLCLR zu schreiben, damit diese SQLCLR-geschriebenen Validierungsregeln leicht aufgerufen werden können.

Dies ist das erste Mal, dass ich SQLCLR benutze/erkunde, also mache ich mir Sorgen, wenn die Leistung darunter sinkt. Ich mache so etwas wie die Umwandlung von C# -Anwendung in SQLCLR-Anwendung.

Bitte schlagen Sie mir über die Leistung von sqlClr mit dem obigen Szenario.

Vielen Dank im Voraus

+0

Wenn die Leistung ein Hauptproblem darstellt, sollten Sie den Validierungscode in T-SQL Stored Procedures schreiben und CLR vermeiden, oder, noch besser, deklarieren Sie die Validierung deklarativ mit DDL. –

+0

Danke für die Antwort. In meinem Szenario plane ich, eine separate C# -Klassenbibliothek zu erstellen und diese DLL in SQL aufzunehmen und die in diesen DLL geschriebenen Funktionen zu verwenden, um Zeilen zu validieren. Hab ich recht? Verstoße ich Standard-Design-Regeln durch Hinzufügen von DLL in SQL ?. – sandeep

+1

Validierung mit CLR kann technisch erfolgen, aber T-SQL ist schneller für SQL Server Datenzugriff. Wenn die Leistung eine große Rolle spielt ** und Sie alle Ihre Validierungslogik steuern (Sie sind nicht von anderen Assemblys abhängig), gibt es wahrscheinlich keinen Grund, T-SQL nicht zu verwenden. Noch besser für die Leistung, prüfen Sie Daten mit DDL (z. B. eindeutigen Schlüsseln) und überprüfen Sie nicht alle Zeilen in einer Tabelle für jede neue Zeile (dies kann zu großen Problemen mit der Skalierbarkeit führen). –

Antwort

1

ohne konkrete Beispiele dafür, was die Validierung (en) muß auf den Daten durchgeführt wird, ist dies eine sehr verallgemeinerte Frage, die es schwierig macht, etwas mehr als eine generali Empfehlung zu geben. Zu diesem Punkt, hier einige allgemeine Informationen über SQLCLR (oder die CLR-Funktionen in SQL Server) vs T-SQL:

  • Es ist absolut nicht wahr, dass gerade T-SQL ist immer schneller als eine CLR-Routine, um die gleiche Operation durchzuführen. T-SQL ist eine Datensprache und ist nicht unbedingt am besten geeignet, um String-Manipulation oder andere Dinge, für die es Funktionen hat, zu tun . Ich veröffentlichte eine ziemlich detaillierte Analyse auf einfaches Sprechen in Bezug auf ebendieser Frage: http://www.simple-talk.com/sql/t-sql-programming/clr-performance-testing/

  • Daten können nur abgerufen oder über SQL manipuliert werden, so gibt es keinen wirklichen Vorteil lediglich Einwickeln SELECT oder DML-Anweisungen in einer .Net ist Sprache, wenn Sie nicht gehen , um auch eine Berechnung, die nicht so schnell oder sogar möglich ist in geraden T-SQL zu tun. Eine SQLCLR-Routine muss noch eine Datenbankverbindung öffnen, um mit Datenbankobjekten (Tabellen, Sichten usw.) zu interagieren, und selbst wenn Sie die context_connection verwenden, wenn der Code nicht mehr als direktes T-SQL in der SqlCommand, dann dieser ist ein schlechtes Design/Verwendung von SQLCLR.

  • SQLCLR sollte nicht als ein Ersatz für T-SQL gesehen werden. Es muss als ein Werkzeug angegangen werden, das Sie an bestimmten Orten unterstützen kann, wo entweder die Operationen weniger effizient wären in T-SQL oder nicht einmal möglich. Es ist manchmal möglich, die Funktionalität mit sp_OACreate usw. zu erweitern, aber das hat seine eigenen Probleme. Ich habe es am besten gefunden haben einen Mittelweg, wo bestimmte Algorithmen, die nicht einfach oder möglich oder effizient in T-SQL zu tun sind von .Net zu T-SQL über benutzerdefinierte Funktionen und gespeicherte Prozeduren, die Sie ausgesetzt sind Rufen Sie von Ihrem T-SQL-Code auf.Ich habe eine Bibliothek von Funktionen und Verfahren tun dies nur die SQL # genannt wird (SQLsharp), die meist frei und kann unter: http://www.SQLsharp.com/


Mit all diesem Hintergrund Ihre Situation von:

Ich muss alle Datenzeilen in der Tabelle validieren, sobald neue Zeile eingefügt wird.
...
Jede Zeile, die in die Tabelle eingefügt wird, sollte die Validierungsregeln durchlaufen, und diese Regeln können basierend auf Daten in der Zeile variieren.

klingt wie es auf dem Tisch einen regulären T-SQL INSERT mit, UPDATE-Trigger am besten geeignet ist, die eine Kombination von geraden T-SQL verwendet und vielleicht einige SQLCLR Routinen (abhängig von der spezifischen Validierung durchgeführt wird) gegen die "eingefügte" Tabelle. Und wiederum, abhängig von den spezifischen Algorithmen, die Sie für die Validierung verwenden, können Sie für diejenigen, die in CLR besser ausgeführt werden, eine gewisse Effizienz erzielen, indem Sie einige dieser Algorithmen in einer einzigen .Net-Routine kombinieren, um die Startkosten des Aufrufs zu reduzieren externe Routine.

Natürlich hängt die Frage, ob ein Trigger am besten ist oder nicht, von der Häufigkeit von INSERTs und UPDATEs ab und davon, wie viele Validierungen durchgeführt werden und wie viele Zeilen innerhalb der nächsten Jahre in der Tabelle liegen. Wenn die DML-Frequenz sehr hoch ist und/oder viele Zeilen vorhanden sind, ist vielleicht ein getrennter Ansatz besser, aber das würde die Empfehlung zur Implementierung der Validierungsalgorithmen nicht ändern. Wenn die Validierung zu lange dauert (Sie möchten die DML-Operation nicht zu lange aufhalten und Blockierungen verursachen), können Sie den Schlüsselwert (die Schlüsselwerte) in einer separaten Queuetabelle mit einem SQL-Trigger speichern Job kann alle paar Minuten verarbeiten und entscheiden, ob oder nicht behalten. Wie schon gesagt, würden Beispiele für die Validierungen bessere Empfehlungen geben, wo es am besten ist, jeden Algorithmus zu handhaben, aber hoffentlich gibt diese Information Ihnen, was Sie brauchen, um eine bessere Entscheidung zu treffen.

Und denken Sie daran, nur durch Testen werden Sie wissen, welcher Ansatz für einen bestimmten Algorithmus schneller ist!

Verwandte Themen