Daten von SQL-Server aktiv an Clienten schicken (Machbarkeitsanalyse)

Mr.Ed

Neues Mitglied
Hallo zusammen.

Ich sitze hier grade an einem Projekt, das mir Daten aus einer Datenbank abruft um diese auf einem Tablet in einer UWP-App darzustellen.
Diese Daten zeigen unserem Staplerfahrer welche Teile als nächstes für die Produktion benötigt werden.

Das läuft soweit auch alles schön. Über einen Timer rufe ich alle 30 Sekunden neue Daten ab und präsentiere die dann entsprechend.

Das meine Queries aber über mehrere Tabellen laufen und ich auch noch Daten von zwei unterschiedlichen Servern zusammenführen muss braucht so eine Anfrage natürlich schon ne ganze Weile bis sie abgearbeitet wurde. Je nach weiterer Auslastung im Netzwerk und Abfragen am Server liegt meine Dauer für die Abfrage irgendwo zwischen 5 und 8 Sekunden. Und das obwohl der Datensatz den ich im Endeffekt rausbekomme gar nicht mal so groß ist, irgendwas zwischen 40 und 60 Values.

Hier meine Idee, die mit Sicherheit nicht neu ist, zu der ich nun versuche Informationen sammeln:
Kann ich den Datenverkehr nicht dahingehend optimieren, dass ich dem SQL-Server beibringe, die Abfragen die ich sonst im 30Sekunden-Takt übermittle einfach selbstständig auszuführen und mir die Daten selbstständig zu übermitteln, wenn sich Änderungen ergeben? Oder noch besser, nur die Änderungen zu übermitteln.

Ich habe hierzu schon Mutter Google bemüht. Leider fehlen mir aber scheinbar die richtigen Schlüsselwörter um hier was gescheites rauszubekommen.

Was ich bislang herausgefunden habe ist, dass ich wohl mit Hilfe von Veröffentlichungen meine Daten automatisiert zusammenstellen zu lassen.
Und die auch mit einem Abonnement an Abonnenten verteilen kann.

Jetzt wäre hier die Frage, ob ich damit schon auf dem richtigen Weg bin, oder doch eher auf dem Holzweg?
Gibt es noch andere Themen die ich an dieser berücksichtigen muss oder muss ich mich da doch ganz wo anders umschauen?

Falls hier jemand eine Idee zu dem Thema hat, würde ich mich über ein paar Tipps oder Hinweise sehr freuen.

Liebe Grüße,
Mr.Ed
 
Für mich klingt das erst einmal, wenn es zu langsam ist, nach einem Problem im Backend-Design.
Nur Änderungen zu Übermitteln gibt halt wieder mehr Last im Backend, das würde ich also lassen(einfach weil du da einen Overhead gegen den anderen tauscht), für mich klingt deine Frage insgesamt nach einem X-Y-Problem, ich vermute das wird eher ein Problem sein, wo ganz viele kleine Geschwindigkeitseinbußen sich aufaddieren(und ich vermute, die übermittelten Datensätze sind so klein, dass nur den Diff übertragen keinen erheblichen Speedup bringt. Wenn die Datensätze groß sind würde ich es eher mit Kompression versuchen)

Ich würde da vielleicht erst einmal genau benchmarken oder analysieren WAS so lang dauert.Dann als erstes schauen, ob Webserver und Datenbanken sauber konfiguriert sind und genug RAM etc. haben(wenn die Datenbank zwischendurch swappt ist das vermutlich schon ein großer Teil des Zeitverlustes). Dann sicherstellen, dass die Tabellen alle in der 5. Normalform sind, um die SQL-Query-Times klein zu halten. Wenn du die Datenbanken alle soweit optimiert hast, dass SQL besonders schnell ist( auch ruhig mal über die Typen und so gucken, da sind manche auch überraschend langsam) und du keine besonders lahmen Queries absetzt, würde ich mir als nächstes das "Zusammenführen" angucken, wenn beide Datenbanken auf verschiedenen Maschinen sind(Vielleicht kann man da mit Caching was tun).

Asynchrone Abfragen gehen natürlich, aber dann muss man auch den Client entsprechend umgestalten, das kann man nicht einfach in-place austauschen, ist aber natürlich generell die bessere Lösung und software sollte eigentlich von Beginn an asynchron designed werden, wenn möglich und anwendbar.

Wenn das immer noch nicht hilft und du mehr Performance brauchst, ich nehm einfach mal an du benutzt PHP oder irgendwas Ähnliches(hier einfache Websprache der Wahl einfügen), würde ich wohl das Backend mal in etwas flotterem, wie C oder C++, neu und optimiert nochmal schreiben(besonders wenn das Backend "gewachsen" ist und nicht mit Fokus auf Performance gebaut wurde, durch sowas gibts oft sehr unschöne "Ich hab erstmal irgendwas gemacht"-Algorithmen etc. Wenn jemand nen Bogosort benutzt ist das auch in der besten Sprache, mit allen sonstigen Optimierungen, auf dme schnellsten Supercomputer noch lahm und skaliert furchtbar).

Leider ist deine Beschreibung recht vage, so daß ich da nur generelle Tips geben kann, sorry.

MfG

P.S. Mir ist grad noch eingefallen: Parallelismus ist super!(wenn du den schon hast: schließ unbedingt race-conditions, mehrfaches starten von PHP/Python... Interpretern, locks etc. aus)
 
Zuletzt bearbeitet:
Hi lowl3v3l,

danke für diene Antwort. Ich hatte die Frage bewusst vage gehalten, weil ich nur Anregungen wollte und keine fertige Lösung. Sonst geht mir der Lerneffekt verloren. :geek:

Ok, ich dachte UWP wäre eindeutig :D aber ich programmiere in C# und war ursprünglich mit Win-Forms unterwegs. Da das aber ja über kurz oder lang ausstirbt wollte ich mich für dieses Projekt jetzt mal mit UWP auseinandersetzen, weil eben klein und kompakt ist aber trotzdem großes Potential für mich hat, was dran zu lernen.

Aber, du hast völlig recht, die ganze Umgebung ist über die Jahre gewachsen und in wie weit hier auf Performance geachtet wurde, kann ich nicht beurteilen, aber daraus resultiert leider auch mein Problem, das ich auf mindestens dem einen SQL-Server nicht selber dran schrauben kann, da kann ich froh sein überhaupt Daten rauszubekommen. Da läuft unser ERP-System drauf und dass ich dahin eine Verbindung aufbaue wird schon nicht gern gesehen. Umso lieber ist es mir natürlich hier eine möglichst performante Lösung zu finden um nicht hinterher als der Depp da zu stehen, der die Schuld dafür bekommt, dass das System so langsam läuft. ;)
Ich denke das wird hier jeder in der ein oder anderen Form kennen. :sneaky:

XY-Problem, naja, relativ würde ich sagen. ich weiß dass sich an X nichts ändern wird, weil das von der Mutterfirma schon fest in Drittanbieterhand gegeben wurde und ich mich nur mit Y herumschlagen kann. Von daher bleibt mir nur aus Y das bestmögliche zu machen.

Die Geschwindigkeitseinbußen kommen halt einfach durch die große Masse an Anfragen und zum Teil auch die Datenmengen die transportiert werden. Zum Teil über hunderte Kilometer VPN-Tunnel. Da wir echt viele MDE-Geräte im Einsatz haben, die für jeden Arbeitsschritt immer wieder eine neue Abfrage starten und das mit der gekauften Software einfach nicht anders zu bewerkstelligen ist werde ich da leider nichts dran ändern können.

Aber deine Hinweise haben mir schonmal etwas weitergeholfen. Vielleicht kann ich ja in der Hinsicht was bewegen.
Trotzdem würde mich immer noch die Frage interessieren die ich eingangs gestellt habe.

Gibt es die Möglichkeit dem SQL-Server beizubringen das Ergebnis einer definierten Abfrage selbstständig auszuliefern?
 
5 bis 8 Sekunden sind eigentlich ein so schlechter Wert, dass es kaum mehr durch ein mangelhaftes Softwaredesign erklärbar oder durch eine performantere Sprache behebbar ist. Hast du irgendwie ein grobes Diagramm der Systemlandschaft (inklusive möglicher Bottlenecks und Lastquellen wie VPN-Tunnel und MDE-Geräte)?
 
UWP sagt nur was über eine von zwei Komponenten, nicht notwendig etwas über das Backend. Daher hab ich in den Raum gestellt, dass ich nicht weiß, was du so benutzt(und C# ist nicht die einzige .Net Sprache), ich hab da wirklich schon grausame Sachen gesehen(im Backend ein PHP aus den Zeiten von Friedrich Barbarossa oder so).
XY-Probleme stehen für "Jemand mit wenig Fachahnung hat Problem X, denkt herum, glaubt Y löse das Problem, fragt nach Y, und verwirrt die Profis, weil die nicht wissen, warum jemand Y tun sollte".
Hast du denn saubere Benchmarks etc. gemacht, alle Algorithmen gecheckt usw., dass du das sagen kannst? Dann bräuchten wir da mal ein paar Daten, damit wir das genauer beurteilen können, da hat @dominik recht.

Ja natürlich "GEHT" das. Es ist nur ne wahnsinnig dumme Idee(schon weil das dein Problem nicht lösen wird, davon bin ich überzeugt), und du musst halt irgendwas drum herum stricken, das die Asynchronität übernimmt.

@dominik
Das Softwaredesign würde ich explizit NICHT ausschließen. Vor allem bei gewachsenen Systemen akkumulieren sich da oft ganz viele kleine Performanceprobleme oder es gibt mal gern Race-Conditions, weil die Software nicht skalierbar ist. Aber du hast natürlich recht, das wahrscheinlichste ist das nicht, darum hab ich ja zuerst Benchmarken etc. vorgeschlagen.

MfG
 
Guten Morgen ihr beiden,

nein, das hab ich alles noch nicht, ist bei den ganzen unterschiedlichen Systemen und Projekten die wir so im Einsatz haben für mich alleine nicht ganz so einfach. Grade auch weil, ich mich hier in fremden Code einarbeiten muss und hier sozusagen ja zwei unterschiedliche Standorte betrachtet werden müssen.

Da mich das Thema selbst interessiert werde ich da auf jeden Fall dran bleiben. Aber ich hoffe ihr könnt mir nachsehen, wenn es noch ne Weile dauert bis ich weitere Informationen liefern kann. Denn leider kann ich nicht ausschließlich an dem Projekt arbeiten.
 
Zurück
Oben Unten