Datenbankabfrage bremst Programm - wie kann ich den Vorgang beschleunigen?

... komplette Frage anzeigen

6 Antworten

Das dauert bis zu 20 Sekunden.

Wenn nicht gerade schwere Fehler bei der Umsetzung der Abfrage gemacht wurden, ist es schwierig konkrete oder allgemeine Tipps zu geben. Das Feld der Möglichkeiten ist rieeeeesig. Und die Hinweise sind allzu dürftig.

Du verrätst ja nicht einmal, welches DBMS du im Auge hast.

Ich wollte eine allgemeine Antwort darauf, wie man eine Abfrage beschleunigen kann d.h. Tipps zum Schreiben der Abfrage, Tipps zur Programmierung(sprich was eignet sich für eine Abfrage von weniger Daten und was eignet sich für eine Abfrage von sehr vielen Daten) und so weiter.

Darüber wurden Hunderte Bücher geschrieben. Wie soll man die in 5.000 Zeichen pressen, so dass du daraus "etwas mitnehmen" kannst, ohne dich über "zu allgemeine" oder "falsche" Tipps zu ärgern?

Dabei bitte auf das mit Java geschriebene Programm als auch die Abfrage eingehen.

Versuchen wir es mal:

Im Folgenden versuche ich, einen "General-Tipp" zu geben, der immer und überall funktioniert und den du immer und überall anwenden kannst. Adaptiere ihn für deine Notwendigkeiten bzw. Befugnisse (manches KANN man einfach nicht lösen, weil man nicht die Erlaubnis/Berechtigung bekommt).

1. Performance messen: Ich würde mit Performance-Messungen beginnen: Wo - genau! - wird es "langsam"? Finde die EXAKTE STELLE; sowohl im JAVA-Programm, als auch in der oder den Abfragen! Ist es immer langsam, oder nur, wenn bestimmte Bedingungen eintreten? Wenn Bedingungen eintreten müssen, welche sind das genau? 

2. Logische Wege finden: Dann würde ich anfangen, mir zu überlegen, ob überhaupt immer der ganze Vorgang nötig ist. Wenn beispielsweise analytische Funktionen laufen (die oft seeeeehr langsam sind), müssen die das? Kann man diese Arbeit nicht (asynchron?) verlagern, aufteilen oder zerlegen und so die Abfrage beschleunigen?

Hier gibt es Milliarden Möglichkeiten, die nur du selbst einschränken kannst, weil nur du weißt, auf was du deine Wege sockeln musst. 

Beispielsweise kann es auch ein Weg sein, die Datenbank(en) einfach auf verschiedene Rechner und/oder Festplatten zu verteilen und so die Performance zu verbessern. Das geht aber nur, wenn du entsprechende Mittel und Rechte besitzt. Auch die Ressourcen, die der SQL-Server zur Verfügung hat, solltest du prüfen. Gar nicht so selten wird unterschätzt, wie hungrig die Dinger sind. Und dann kann schon ein einfacher RAM-Riegel, der in 5 Minuten eingebaut ist, die Leistungen spürbar verbessern.

... es ist also nicht immer nur die Software, die stockt...

3. Grobe Revision der Arbeit: Code-Säue neigen, wenn man sie allein lässt, gern zum "Vergolden" ihrer Arbeit. Das heißt: Sie fügen Funktionen ein, die man nicht wirklich braucht; und das, nur weil sie es können oder weil sie es lustig finden. Auch das ist ein Ansatz, den man prüfen kann...

Entsprechend des in Punkt (2) ausgewählten Weges, kann es also sinnvoll sein, diese Arbeit (grob) zu zerlegen und nach "Performance fressenden Bestandteilen bzw. Vergoldungen" zu suchen.

Lass die Abfrage schrittweise durchlaufen (zerlege sie ggf. auf einem Dev-Rechner) und schaue dir an, was sie macht. Frage dich bei jedem Schritt: "Kann man darauf verzichten?" Markiere entsprechende Stellen; auch - und gerade - dann, wenn du "Vielleicht?!" antworten müsstest. (Das sind im Regelfall die viel versprechenden Stellen.)

Gleiches gilt für offensichtliche Fehler beim Basteln des relevanten Codes. Nicht jeder Code-Schreiber hat wirklich Ahnung von dem, was er tut. Die meisten probieren sich im "Try-and-Error"-Prinzip, bis es irgendwie funktioniert. Da steckt oft enormes Potenzial. Der Haken ist hier nur die "Offensichtlichkeit". Offensichtlich ist nur, was man selbst "richtiger/besser weiß"...

4. Feintuning: Und schließlich kannst du direkt in den Code des Programms bzw. der Abfrage gucken: Gar nicht so selten erlebt man, dass Abfragen allzu komplex gestellt werden und (sehr viel) mehr Arbeit verrichten, als nötig wäre, um das geforderte Ergebnis zu bringen. Selbst einfachste JOINS entziehen sich meiner Erfahrung nach oft dem Verständnis des Programmierers. 

Das verlangt aber in der Regel SEHR tiefgründige Kenntnisse der entsprechenden Programmier- bzw. Abfrage-Sprachen.

Je nach DBMS stehen dir dabei verschiedene Hilfsmittel (sogenannte "Performance Optimizer") zur Verfügung, die zumindest mögliche Ansätze erkennen und grobe Schnitzer ausbügeln können.

*zack* ... Zeichenbegrenzung

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von Unsinkable2
13.11.2015, 12:02

Oh, und noch ein "menschlicher Hinweis":

Ich finde es echt schade, dass gleich so viel an mir rum kritisiert wird, da ich nur eine Frage gestellt hab.

Erstens solltest du aufhören, dich "emotional angepisst" zu fühlen. Ich weiß, das das nicht leicht ist, aber die "Kritik" war durchaus berechtigt. Du hast ja nicht einmal verraten, welches DBMS oder welche JAVA-Version du benutzt. 

Es war also keine Kritik an dir (als Person), sondern Kritik an den Informationen, die du gibst. 

-----------------------------

Wenn du zukünftig Fragen stellen willst, dann konkretisiere so weit es geht. Und was du nicht verraten darfst, kannst du oft durch Umbenennungen, Abstraktionen oder Auszüge darstellen.

Tipp fürs Leben: Auch, wenn der Volksmund sagt, es gäbe keine dummen Fragen, sondern nur dumme Antworten ... Um eine gute Antwort zu bekommen, bedarf es auch guter Fragen. Je konkreter du sie stellen kannst, desto mehr kannst du auf konkrete Antworten pochen...

Und nicht zuletzt gilt (auch das ein Tipp fürs Leben): Man kann nicht beleidigt werden; man kann sich nur beleidigen lassen. Es ist also immer eine Frage DEINER Einstellung, ob du dich beleidigt fühlst oder nicht...

-----------------------------

Und zweitens kann ich dir aus langjähriger Erfahrung sagen: Die Leute mit den wirklich guten Tipps sind oft die völlig Verstörten; also die, die man nicht auf Menschen loslassen kann, weil ihnen jede Empathie abgeht. 

Das heißt nicht, dass jene, die dich am lautesten beleidigen, zwangsläufig auch die Besten sind. Es heißt aber sehr wohl, dass die Besten oft ziemlich ... nun, "frustrierend direkt" ... sind. Sie meinen es nur nicht so. Sie merken es meistens gar nicht. Ihr Computer fühlt sich schließlich auch nicht beleidigt...

2

Morgen!

Wäre eine Abfragenzerlegung bzw. die Nutzung von Views für dich ein Ratschlag?

Tendenziell kann ich mich aber auch nur den Vorrednern anschließen, ohne das DB-System, die Größe der DB, den Aufbau der Tabellen und die Abfrage selbst zu kennen, ist es schwer eine Aussage zu treffen. Zudem kann es ebenso sein, dass es nicht die Abfrage ist, sondern die Software, diese die Abfrage ausführt. 

Wenn deine Abfrage 20 sec dauert, hast du m.E.n Millionen an Datensätzen, die es zu verarbeiten gilt, oder es sind z.B: größere Bilder gespeichert, die inperformant werden

Möglicher Weise wäre eine Teilabfrage oder neue, spezialisierte Tabellen, eine Lösung.

Ich hoffe ich konnte dir ein wenig helfen!

Liebe Grüße

Noha

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von Schloni1995
03.11.2015, 09:39

Danke für den Ratschlag! Ich werde mich mit Views mal genauer beschäftigen. Das Problem ist einfach, dass gerade ich als Lehrling keine firmeninternen Daten veröffentlichen darf.

0

Wenn die lange Abfragezeit damit zu tun hat, dass ein schlechtes Design vorliegt kann man in der Tat vieles rausholen durch komplette Optimierung des Codes und der Datenbank. Wenn es damit zu tun hat dass eine schlechte Verbindung besteht oder dass extrem viele Datensätze geladen werden müssen dann kann man nur noch durch Treads versuchen das Programm performant zu halten aber die Dauer kann nicht verkürzt werden.


Antwort bewerten Vielen Dank für Deine Bewertung

Die Abfrage kann gegebenenfalls angepasst werden, so das Werte nicht doppel oder teilweise doppelt abgefragt werden.. Da kann ich aber nicht helfen, da es micht nichts angeht.

Wenn das Programm auf die Datenbank wartet, kann nichts von deiner Seite aus angepasst werden.. Da wir auch nicht Wissen um was es genau geht, können wir dir auch nicht helfen. Wende dich bitte an die zuständige IT.

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von Schloni1995
03.11.2015, 07:25

Ich bin der Nachfolger....
Die Tipps sind schon super, danke!!!

0

Wenn es Darum geht Datensätze zu suchen und sie in einer Tabelle anzuzeigen kannst du Paging benutzen um nur genau die Daten zu bekommen die du auch tatsächlich anzeigen willst.

Falls der Benutzer auch weiter arbeiten kann ohne die Daten zu bekommen kannst du die Datenabfrage in einen anderen Thread packen.

Antwort bewerten Vielen Dank für Deine Bewertung

Wie sollten wir hier auf ein Programm und eine Abfrage eingehen, wenn wir von beidem nicht wissen, wie die Software aufgebaut ist?

Antwort bewerten Vielen Dank für Deine Bewertung
Kommentar von Schloni1995
03.11.2015, 07:34

 AsuraDeYien konnte es auch...

0
Kommentar von Herb3472
03.11.2015, 07:41

AsuraDeYien hat auch geschrieben, dass er Dir nicht helfen kann. Du musst mit Euren Softwarespezialisten reden, nur die können was ändern. Ich erstelle selbst Datenbank-Software, und das ist der einzige Tipp, den man Dir geben kann.

0

Was möchtest Du wissen?