| 

.NET C# Java Javascript Exception

2
Ich sitze an der Optimierung einer Anwendung. Die Optimierung begrenzt sich hauptsächlich auf die Datenbank und die Queries. Nun ist die Idee aufgekommen, langsame, Datenintensive Abfragen so zu "timen", das sie dann ausgeführt werden, wenn der User möglichst inaktiv ist.
Die Anwendung ist in C# geschrieben und greift mittels Entity Framework auf die Daten zu. Als RDBMS kommt MS SQL Server zum Einsatz.
Ist das sinnvoll bzw. überhaupt umsetzbar? Mir geht es hier nicht um konkrete Lösungen sondern um Denkanstöße :D

Schon mal danke :D

Gruß
Quitte
01.06.2015
Quitte 11 2
Das Schlüsselwort low_priority gibt es halt leider nur bei INSERT (zumindest im Falle von MySQL). Aber soweit ich das verstehe, hast du die Abfrage eh schon irgendwo fertig. Lass doch einen Backgroundworker die Abfrage erledigen, wenn du festgestellt hast, der User ist grad eingeschlafen? ;-)
muffi 01.06.2015
4 Antworten
1
Ist nicht ganz einfach das zu beurteilen, wenn man die Anwendung nicht besser kennt. Hier mal ein paar Denkanstöße die vielleicht weiterhelfen.

Langsame Abfragen bei Nutzerinaktivität ist keine schlechte Idee, nur leider neigen User dazu genau das zu tun was man nicht von ihnen erwartet. Wenn man sicher weiß, dass der User bei Bedingung X zu 95% wirklich lange genug inaktiv ist, dann kann man das schon machen. Nur woher kann man das wissen? Fenster minimiert? Könnte auch ein versehen sein und der User klickt schon wieder auf maximieren bevor die Animation überhaupt fertig ist... Es könnte aber in deinem speziellen Fall erträglich sein, wenn in dem Fall die Anwendung extrem träge reagiert oder einfriert.

Man könnte die Abfragen auch in eigene Threads auslagern die im Hintergrund laufen und die Weiterverarbeitung der Query-Ergebnisse erfolgt asynchron. Macht den Code aber komplexer.

Wenn sich die Query-Ergebnisse gut über längere Zeit chachen lassen, dann am besten nur einmal abfragen, und die Ergebnisse cachen. Macht aber keinen Sinn wenn sich die Daten alle paar Sekunden ändern können.

Eventuell lassen sich auch einige Queries beschleunigen indem man die Queries weniger komplex gestaltet und die Feinfilterung durch Anwendungscode realisiert.

Datenbankseitig könnte man versuchen über passendere Indizes die Queries zu beschleunigen, ggf. kann man da auch in Kombination mit Views etwas mehr raus holen.

Unter Umständen lassen sich diese Ansätze auch miteinander kombinieren, es hängt halt sehr Stark von deiner speziellen Anwendung ab.
02.06.2015
phg 1,6k 3
0
Langsame Abfragen zu einer Zeit laufen zu lassen zu lassen, während der Sie die Performance für Anwender nicht negativ beeinflussen, ist prinzipiell eine gute Idee. Deshalb werden Administrative Aufgaben wie Backups oder Index-Neuberechnungen auch häufig außerhalb der Bürozeiten durchgeführt.

Bevor man jedoch eine Optimierung dieser Art durchführt, sollte man zu erst herausfinden, inwieweit die derzeitigen Abfragen tatsächlich die Performance negativ beeinflussen. Das wichtig, denn wenn man eine solche Änderung durchführt, ohne wirklich sicher zu sein, dass die Anwendung tatsächlich durch die Abfragen ausgebremst wird, hat man im Zweifelsfall nur viel unnötige Arbeit investiert und die Architektur bzw. den Code der Anwendung unnötig verkompliziert. Sicher herausfinden, ob die Abfragen das Problem sind, kann man mit einem Performance Profiler wie z. B. dem ANTS Performance Profiler. Dieser bietet die Möglichkeit nicht nur die durch den .NET Code verursachte CPU-Last zu sehen, sondern er zeigt auch alle vom Entity Framework generierten Datenbankabfragen inklusive Laufzeit und SQL Server Ausführungsplan an. Somit wird sofort klar, ob die Datenbankabfragen das Problem sind.

Wenn als Ergebnis herauskommt, dass es Vorteile für den Benutzer bringt, die langsamen Abfragen während Zeiten der Nutzerinaktivität auszuführen, dann kannst du mehrere Heuristiken nutzen, um zu entscheiden, ob der Anwender gerade aktiv ist, oder nicht. Eine einfache wäre es, die Zeit seit der letzten User Interaktion zu prüfen. Mit etwas Kenntnis über die Anwendung lassen sich aber bestimmt noch bessere Wege finden. Falls der Benutzer zum Beispiel längere Text angezeigt bekommt, dann könnte man davon ausgehen, dass er in diesen Text auch liest und man somit vielleicht 30 Sekunden oder mehr hat, um eine der langsamen Abfragen zu starten.

Ich gehe mal davon aus, dass die Abfragen bereits asynchron ausgeführt werden (entweder mit C# 5 async / await, oder über den „harten Weg“). Falls nicht, dann wäre es jedoch wichtig die Anwendung entsprechend zu ändern. Falls deine Heuristik zum Erkennen der User Interaktivität nämlich manchmal auch fälschlicherweise eine Inaktivität ermittelt, so wäre es für den Benutzer zumindest nicht hinderlich, wenn die Abfrage trotzdem ausgeführt werden würde, da der UI Thread dann ja nicht mehr blockiert wird.

Viel Erfolg bei der weiteren Optimierung!
30.06.2015
0
This is the useful tool to get the clash royale hack download here.
14.01.2017
0
The game is best known for its dark sense of humor and its graphic violence. Expect to see a lot of blood and guts. Your goal is to go far across each level without letting your character get hurt. The game is over even the smallest body part injuries. It takes much patience to finish the goal. Is this much challenging? Make your best efforts to survive in this glory and funny game. We can find a way to break through Even if we can't find heaven, I'll walk through hell with you. =>happy wheels
=>geometry dash
25.07.2017

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH