Gute Idee, Logik aus SQL-Anweisungen zu entfernen?

8

Ich werde diese Frage vorwegnehmen, indem ich sage, dass ich für professionelle Softwareentwickler sehr neu bin.

Ich arbeite in einem Team, das Daten von anderen Gruppen in meinem Unternehmen aufnimmt und diese Daten in Berichte umwandelt, die von Geschäftsführern verwendet werden können.

Beim Übertragen und Parsen von Daten haben wir einige SQL-Anweisungen, die viel Daten verarbeiten. Fast alle SELECTAnwendungen TRIM, SUBSTR, CASTetc ausführlich Felder auf die richtige Größe und das Format zu reduzieren. Darüber hinaus gibt es viele Sonderfälle, die durch die Verwendung von CASEAnweisungen in SELECT's berücksichtigt werden .

Die von uns verwendete Teradata-Serversoftware gibt bemerkenswert kryptische Fehlermeldungen aus. Infolgedessen raten wir viel darüber, welche Daten welche SQL-Anweisung beschädigen.

Meine Frage ist: Wäre es eine gute Idee, diese etwas komplexen SQL-Anweisungen auf eine weniger komplexe Form zu reduzieren, bei der die Verarbeitung und die Behandlung von Sonderfällen weggelassen werden, und dies stattdessen in einem externen Skript oder Programm zu tun? Ist das sinnvoll?

Bryan Glazer
quelle

Antworten:

12

Ein großer Vorteil des Verschiebens des Verarbeitungscodes aus Ihrem SQL besteht darin, dass Ihr SQL viel einfacher zu verwalten ist.

Ein Nachteil ist, dass Sie, wenn Sie diese Abfragen jemals in einem anderen Programm verwenden möchten, Ihre Ergebnisverarbeitungsprozesse jetzt dem anderen Programm zur Verfügung stellen müssen. Es könnte so einfach sein wie das Kopieren einer Bibliotheksdatei, die die erforderlichen Klassen enthält, aber es bedeutet immer noch, dass alle Änderungen an der Bibliothek weitergegeben und alle Clients mit der neuen Bibliothek neu erstellt werden müssen.

Eine weitere Option: Verwenden Sie eine Ansicht (oder mehrere Ansichten, wenn Sie unterschiedlich formatierte Ergebnisse für verschiedene Clients benötigen), um den größten Teil des Formatierungscodes zu enthalten. Auf diese Weise können Sie die "rohen" oder gut formatierten Abfrageergebnisse erhalten, je nachdem, was Sie benötigen.

FrustratedWithFormsDesigner
quelle
3
+1 für den Vorschlag einer Ansicht, mit der sie das Formatierungs-SQL vom logischen SQL trennen können.
2
+1 für eine Ansicht. Auf jeden Fall die erste Lösung, die ich in Betracht ziehen würde.
Matt S
6

Ich stimme dem bereits gemachten Vorschlag zu, eine Ansicht für diese Logik zu verwenden. Ich möchte nur noch etwas zu den Case-Aussagen hinzufügen. Beachten Sie, dass das Herausziehen der Case-Anweisungen aus dem SQL zu erheblichen Auswirkungen auf die Leistung des Systems führen kann. Diese Case-Anweisungen können die zurückgegebene Datenmenge erheblich reduzieren. Das Ausführen der Fallfilterung in der Datenbankebene über SQL-Anweisungen ist normalerweise viel effizienter als das Zurückziehen aller Daten und das Filtern in einem externen Skript oder Programm. Wenn Sie dies in Betracht ziehen, empfehle ich dringend, einige Datenanalysen und Leistungstests durchzuführen, bevor Sie mit dieser Lösung fortfahren.

Shane
quelle
4

Das Hinzufügen eines externen Prozesses erschwert normalerweise nur das Debuggen des Systems, hängt jedoch wirklich von der jeweiligen Situation ab. Verwenden Sie Ihr Urteilsvermögen . Berücksichtigen Sie die Zeit, die für die Entwicklung / Wartung von Out-of-Band-Projekten erforderlich ist.

Verwenden Sie bereits einen ETL- Prozess? Ich habe keine Erfahrung mit Teradata, aber die Trennung Ihrer Schritte bietet eine viel klarere Sicht auf die Vorgänge. Hier ist eine 2 Sekunden Übersicht:

  1. Extrahieren: Ziehen Sie Ihre Daten aus der Quelle und speichern Sie sie in einem temporären Speicher der Stufe 1. Ändern Sie nicht das Format der Daten.
  2. Transformieren: Ziehen Sie von Stufe 1 ab und führen Sie alle hier erforderlichen Schritte / trim / substr / cast / formatierung usw. aus. Legen Sie es in die Zwischenlagerung der Stufe 2.
  3. Laden: Ziehen Sie aus Stufe 2 und legen Sie alle Daten in den Zielspeicher.

Dies liefert normalerweise genügend Informationen, um diesen Systemtyp erfolgreich zu verwalten.

Zachary Yates
quelle
2
Ahh ja, ETL ist genau das, was wir tun. Außer es scheint eher ETTTLTLTL zu sein, wobei die meisten Transformationsschritte in SQL ausgeführt werden. Ich denke, mein Ziel ist es, die Transformationsschritte in einer erweiterbaren Sprache mit besserer Fehlerbehandlung als Teradata SQL zu schreiben, was eine Katastrophe ist.
Bryan Glazer
3

Ich wäre geneigt, die CASE-Bits an Ort und Stelle zu lassen, da diese mit der tatsächlichen Logik der Erzeugung der Daten für jemanden / eine Sache zum Konsumieren zusammenhängen. Wenn Sie diese herausnehmen, müssen Sie einen größeren Datensatz zurücksenden und der Client muss einige Verarbeitungsschritte ausführen. Jetzt haben Sie Ihre Berichts- "Logik" auf zwei separate Ebenen aufgeteilt, und dies ist nicht gut.

Aber ich würde jede Formatierung aus Ihrem Code wie ein heißer Stein löschen (es sei denn, sie ist speziell Teil von JOIN-Prädikaten usw.), da die Formatierung Aufgabe des Verbrauchers ist. Unabhängig davon, welches Berichtstool sie verwenden, sei es Excel, Crystal usw. ist gut darin, Sachen im richtigen Gebietsschema und im ganzen Jazz zu formatieren. Lassen Sie den Client das tun, was er kann (Dinge in hübschen Farben anzeigen), und lassen Sie den Server sich auf das konzentrieren, was er am besten kann - das Knacken von Daten.

Stephen Byrne
quelle
In einigen Umgebungen wird die Anwendung, die die Daten verbraucht, möglicherweise auch auf dem Server selbst ausgeführt. Dann stellt sich die Frage, wo es effizienter ist, Formatierungen oder andere Transformationen durchzuführen. In einigen Fällen, insbesondere wenn sich Werte häufig wiederholen, kann es insgesamt effizienter sein, den Server einmal für jeden angetroffenen Wert eine deterministische Funktion verwenden zu lassen und einfach die zwischengespeicherten Ergebnisse für das spätere Auftreten dieser Werte zu verwenden. Warum sollten mehrere Anwendungen dieselbe Transformation berechnen, wenn der Server dies einmal für alle tun kann?
WarrenT
@WarrenT, das ist ein fairer Punkt, ABER wenn diese Funktionen deterministisch sind, warum sollte man sich dann die Mühe machen, sogar zwischenzuspeichern, nur zu berechnen und zu speichern, wenn Daten in den Tabellen erstellt werden? Eine schlechte Idee in Ihrer Datenbank - Sie gehen davon aus, dass alle diese Anwendungen möchten, dass die Daten, die sie ihren Benutzern anzeigen, dasselbe Format haben. Dies bedeutet, dass beispielsweise jeder in Ihrem Büro in Übersee Berichtsdaten als TT / MM / JJJJ anzeigen muss, nur weil die Datenbank in britischem Englisch lokalisiert ist. Sicher können Sie zustimmen, dass dies Wahnsinn ist?
Stephen Byrne