schneller von der Datenbank abfragen

Emrullah

Mitglied
Hi würde gern mal wissen ob es ne Möglichkeit gibt das mein Programm die daten schneller abfragen kann weil momentan dauert es bei mir in etwas 5 min um in meiner Datenbank ca. 20000-30000 abfragen zu bearbeiten.

ich gebe von Ausgabe/Jahr ein und dann bis Ausgabe/Jahr.

Jetzt sagt mein Programm erstmal
1/1990 -> Datenbank abfrage was es da für Abonnementen gibt's->schließt die Datenbank->2/1990-> usw. und das geht bist 12/2021

ich dachte ich frag erstmal so bevor ich mein Code reinposte mit so viel Fehler und sich alle aufregen XD
 
K

kneitzel

Gast
Also ohne Details zu kennen machen viele Dinge Sinn, die man aber jetzt nur allgemein ansprechen kann:

a) Ständiges Öffnen / Schließen der Datenbank: Das ist etwas, das so keinen Sinn macht und extrem langsam ist. Dies im Code umzusetzen verkompliziert den Code aber! Das macht wenig Sinn, seinen Code so zu verkomplizieren! (Wenn man eine Connection hält, dann muss ggf. sicher gestellt sein, dass diese noch offen ist und valid u.s.w.)
==> Wie so oft, gibt es da natürlich eine fertige Lösung: Connection Pooling. Unterstützt ggf. schon der JDBC Treiber selbst und wenn nicht, dann gibt es dazu separate Lösungen, die man einbinden kann und über die es dann läuft. D.h. Du passt (mehr oder weniger) nur den Connection String an und hast dann die Zugriffe wie gewohnt mit try-with-resources Blöcken bei denen die Verbindung direkt geschlossen wird.

b) Fasse SQL Abfragen zusammen. Also statt viele einzelne Abfragen zu erstellen, erstellst Du weniger Abfragen. Statt also 1/1990, 2/1990, ... abzufragen, machst Du eine Abfrage auf alle Elemente, die eben 1/1990 oder 2/1990 oder 3/1990 oder .... haben.

ich dachte ich frag erstmal so bevor ich mein Code reinposte mit so viel Fehler und sich alle aufregen XD
Also aufregen tut sich eigentlich niemand, aber Du wirst ggf viele Anregungen bekommen. Und nie vergessen: Es wird ja nur über den Code "geschimpft" und nicht über Dich. Es ist bisher noch kein Meister vom Himmel gefallen.
 

Emrullah

Mitglied
@kneitzel

danke für deine schnelle Antwort :D

das mit den schimpfen nicht aber viele hätten glaub ich dann durch Kopfschütteln ein Schleuder Trauma erlitten :)

also wie ich es verstanden habe meinst das ich den Zeitraum als Array setzte z.b.

Zeitraum[1] = 1/1990
Zeitraum[2] = 2/1990
usw.

dann den Array direkt in der Datenbank durchlaufen lasse ohne die Verbindung zu schließen.

Würde es dadurch effizienter arbeiten??
 

Oneixee5

Top Contributor
Was ist Zeitraum für ein Datentyp? Man könnte z.B.: ein Datum mit between abfragen: zeitraum between datum1 and datum2
 

Emrullah

Mitglied
@Oneixee5

das würde int. sein bzw. mit doppelten Array.

int Zeitraum [Ausgabe][Jahr]

weil ich ja bei der Datenbank beide abfragen müsste.

dann würde ich es mit eine zwei for schleife einbinden

for (int i = 0 ; i <= Jahr.length ;i++){
for (int j=0;j<=Ausgabe.length;j++){
Zeitraum [0][0] // Ausgabe solle dann sein 1 1990
Zeitraum [1][0] // Ausgabe solle dann sein 2 1990
usw
}
}


das würde ich dann in die Datenbank abfrage schicken wodurch ich es nicht immer neu öffnen und schliessen müsste und ich einfach den Array durchlaufen lassen kann.


war dann eher mein Gedanke(ist nur ein Beispiel).
 
K

kneitzel

Gast
Das wäre eine Optimierung aber nicht das, was ich geschrieben habe :)

Der Punkt a dreht sich um ein Connection Pooling.

Der Punkt b dreht sich darum, dass man die Anzahl der Abfragen verringert. Also etwas wie:
SELECT .... FROM ... WHERE YEAR = 1990 and Month in (1, 2, 3, 4, 5, 6, 7);
Wenn das ganze Jahr 1990 abgefragt würde, dann wäre es einfach:
SELECT .... FROM ... WHERE YEAR = 1990;

Wenn mehrere Jahre abgefragt werden als ganzes, dann wäre es etwas wie:
SELECT .... FROM ... WHERE YEAR in (1990, 1993, 1997);

oder bei zusammenhängenden Intervallen:
SELECT .... FROM ... WHERE YEAR >= 1990 AND YEAR <= 1993;

Bei einem Zusammenhängenden Intervall wären das dann 3 Abfragen:
1. Monate des ersten Jahres also Monat 7-12 des ersten Jahres
2. die Jahre dazwischen also Jahr >= x und jahr <= y
3. Monate des letzten Jahres also z.B. Monat 1-4 des letzten Jahres.

Prinzipiell wäre auch denkbar, dass man einfach alle Jahre abfragt und den "Mehrfang" am Anfang und am Ende einfach nicht übernimmt. Das würde ich aber nicht so machen aber es ist eine Option.
 

Emrullah

Mitglied
@kneitzel

die Problem sind das

1. jedes Heft oder Magazin hat unterschiedliche ausgaben pro Jahr.
2. wenn ich den Zeitraum von 2000/bis 2005 angezeigt haben möchte brauch ich natürlich wie viele Abonnementen im Jahr 1990
bis 1999 dazu oder abgegangen sind, das ich ein wert habe für den Anfang von 2000.

deswegen ist immer eine komplette abfrage notwendig.
 
K

kneitzel

Gast
deswegen ist immer eine komplette abfrage notwendig.
Nein, die Schlussfolgerung stimmt nicht. Nur ohne Details zu den Daten, der Datenstruktur und der genauen Abfrage ist das leider nicht konkret zu sagen.

Es mag sein, dass Du alle "vorherigen" Datensätze auch betrachten musst um da halt Dinge aufzusummieren oder so, aber das ändert nichts daran, dass dies die Datenbank machen kann. SQL bietet viele Möglichkeiten - so wäre z.B. eine CTE denkbar, die etwas aufbereitet so dass Du dann da gezielte Abfragen machen kannst. Also z.B. baut die CTE erst eine Tabelle, die alle Rows einer Tabelle sortiert (nach jahr und Monat) um da dann ein neues Feld hinzu zu bauen, das dann halt irgendwas zusätzliches beinhaltet.... (Wobei da ggf. das Datenbankschema überdacht werden könnte. Aber ohne Details keine Aussage möglich.)
 

Emrullah

Mitglied
@kneitzel


zu Datenbank kann ich eigentlich nur sagen (das es extrem unübersichtlich ist )

hab die privaten stellen abgeschwätzt.

es ist eine pervasive Datenbank

und leider kann man die Datenbank nach spalte nicht sortieren ( hab es schon öfters probiert)

Unbenannt.jpg
relevant sind die spalten
ABO_AB_AUSG
ABO_AB_JAHR

ABO_BIS_AUSG
ABO_BIS_JAHR

ABO_Z_ANZ
ABO_FREI
 

mihe7

Top Contributor
viele hätten glaub ich dann durch Kopfschütteln ein Schleuder Trauma erlitten
LOL.

relevant sind die spalten
Damit ein Abo in einem gegebenen Zeitraum A-B gültig ist, muss das Ende E des Abos offensichtlich nach dem Beginn A des Zeitraums liegen (E >= A) und der Start S des Abos offensichtlich vor dem Ende B des Zeitraums liegen (S <= B).

Gibt mir alle "Abonnements", die im Jahr 2000 gültig sind:
SQL:
SELECT * FROM ABO WHERE ABO_BIS_JAHR >= 2000 AND ABO_VON_JAHR <= 2000;

Jetzt willst Du z. B. die Anzahl der Abos, die in den Jahren 2000 bis 2003 gültig sind, das könnte z. B. in etwa so aussehen.
SQL:
WITH RECURSIVE jahre AS (
    SELECT 2000 AS jahr
    UNION ALL
    SELECT jahr+1 FROM jahre WHERE jahr < 2003
)
SELECT jahre.jahr, count(ABO.ABO_NR) AS Anzahl
 FROM jahre LEFT JOIN ABO_BIS_JAHR >= jahre.jahr AND ABO_VON_JAHR <= jahre.jahr
GROUP BY jahre.jahr
ORDER BY jahre.jahr;
 

mihe7

Top Contributor
Das kommt mir immer noch viel zu lange vor. Bei den paar Sätzen würde ich eine Antwort in "Nullzeit" erwarten.
 

Neumi5694

Top Contributor
Versuch mal, mit einer Unterabfrage zu arbeiten. Lass zuerst die Anzahl der Abos pro Jahr auslesen und führe deine Von-Bis Abfrage dann auf diese Unterabfrage aus.
So, wie es aktuell ist, wird für jedes Von-Bis Paar jedesmal alles neu gezählt.

Falls das zu komplex ist, mach die die Von-Bis Summe auf Java-Seite, nachdem du die einfache Anzahl pro Jahr in eine Liste oder eine Map (pro Jahr eine Anzahl) eingelesen hast.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Ein Algorithmus soll schneller werden Java Basics - Anfänger-Themen 24
Hallolu Pong-Spiel: Schläger schneller werden lassen Java Basics - Anfänger-Themen 9
S Was ist schneller: direkte Sortierung oder indirekt ueber eine SortedMap..? Java Basics - Anfänger-Themen 10
M Schneller Timer Java Basics - Anfänger-Themen 2
P Schneller Quadratzahltest für beliebig große natürliche Zahlen Java Basics - Anfänger-Themen 2
H Collections Was ist schneller - HashMap + Sort v TreeMap? Java Basics - Anfänger-Themen 75
H Operatoren Was ist schneller: <, <=, ==, >, >=? Java Basics - Anfänger-Themen 46
P schneller Sort ? Java Basics - Anfänger-Themen 2
V Double schneller als Float? Java Basics - Anfänger-Themen 13
R ArrayList sehr viel schneller als Array? Java Basics - Anfänger-Themen 2
Dit_ Was ist schneller | < oder >= Java Basics - Anfänger-Themen 6
M Java URLConnection schneller bekommen Java Basics - Anfänger-Themen 3
M schneller Klassenvergleich Java Basics - Anfänger-Themen 2
A Datein kopieren: File oder xcopy? Was ist schneller? Java Basics - Anfänger-Themen 10
R java-programme schneller laufen lassen Java Basics - Anfänger-Themen 41
M Mehrere Threads nutzen --> run() schneller als start(), Warum? Java Basics - Anfänger-Themen 3
ruerob Warum ist Timer schneller als While? Java Basics - Anfänger-Themen 9
J Wie java programm noch schneller machen? Java Basics - Anfänger-Themen 30
S LinkedList indexOf() - geht des irgendwie schneller? Java Basics - Anfänger-Themen 23
O String-Prüfung: Was ist besser/schneller? Java Basics - Anfänger-Themen 15
S Schneller Zugriff auf Liste mit sortierten Flaechen..? Java Basics - Anfänger-Themen 7
G Arraysuche schneller ausführen? Java Basics - Anfänger-Themen 14
H Serialization: Was ist besser(schneller) Binary <-> XM Java Basics - Anfänger-Themen 2
N Schneller als FileWriter? Java Basics - Anfänger-Themen 28
G Bessere Lösung für SQL STMNT ? (Schneller?) Java Basics - Anfänger-Themen 4
C was is schneller Vector oder double Array Java Basics - Anfänger-Themen 5
G java optimieren. wie daten schneller in mysqlDB schreiben? Java Basics - Anfänger-Themen 15
E Datenbank Spalte zusammenzählen Java Basics - Anfänger-Themen 2
R Datenbank Java Basics - Anfänger-Themen 1
I API Key´s in der Datenbank decrypt / encrypten? Java Basics - Anfänger-Themen 23
I Werte (u.a. Geldbeträge) in Datenbank speichern und Rundungen? Java Basics - Anfänger-Themen 8
M Mehrere Datenbank zugriffe über tomee.xml regeln? Java Basics - Anfänger-Themen 1
M Datenbank oder Textdatei? Java Basics - Anfänger-Themen 4
S Datenbank Befehl nach Login Java Basics - Anfänger-Themen 5
S Datenbank Tabelle eine Zeile an einer bestimmten Stelle einfügen Java Basics - Anfänger-Themen 2
M Von der Datenbank zum Textfield Java Basics - Anfänger-Themen 16
R Best Practice Logik in der Datenbank oder in Java? Java Basics - Anfänger-Themen 3
R Datenbank-Werte dynamisch ausgeben Java Basics - Anfänger-Themen 19
B Frage zu Datenbank Design - Rechnungen, Angebote... und deren Positionen Java Basics - Anfänger-Themen 4
B Datenbank: Entity mit vielen Referenzen? Ansatz so ok? Java Basics - Anfänger-Themen 8
T Datenbank | Welche am Sinnvollsten? Java Basics - Anfänger-Themen 5
S Daten speichern, ohne Datenbank Java Basics - Anfänger-Themen 8
L Daten aus ArrayList in Datenbank durchsuchen Java Basics - Anfänger-Themen 5
M Datenbank in jTable Laden Java Basics - Anfänger-Themen 49
M Datenbank verbindung Java Basics - Anfänger-Themen 19
J Java Verbindung mit mysql Datenbank Java Basics - Anfänger-Themen 3
B Datenbank, aktuelle Ende als Zahl an Label übergeben Java Basics - Anfänger-Themen 7
T Collections Geeignete Collection/Liste/Datenbank Java Basics - Anfänger-Themen 17
B Treetable (rekursive Funktion) aufbauen von Datenbank Java Basics - Anfänger-Themen 4
R Input/Output Verbindung mit mySql-Datenbank Java Basics - Anfänger-Themen 9
D Compiler-Fehler Wert auf Datenbank übertragen und Sleep Thread Java Basics - Anfänger-Themen 3
N (Java) Regristrierung und Login System mit einer Datenbank Java Basics - Anfänger-Themen 5
J Datenbank Zugriff Java Basics - Anfänger-Themen 24
J Mit JSF Formular in Datenbank schreiben Java Basics - Anfänger-Themen 3
DaCrazyJavaExpert Verschiede Aktionen der Datenbank getrennt durchführen Java Basics - Anfänger-Themen 4
DaCrazyJavaExpert Datenbank wird nicht erstellt Java Basics - Anfänger-Themen 31
E Daten gehen nicht in Datenbank Java Basics - Anfänger-Themen 14
C JTable update mit MySQL Datenbank Java Basics - Anfänger-Themen 1
Meeresgott OOP Gui, Logik und Datenbank richtig aufbauen Java Basics - Anfänger-Themen 43
B Schreiben von zu vielen Einträgen in einer Datenbank Java Basics - Anfänger-Themen 9
S Datenbank auf Knopfdruck abfragen Java Basics - Anfänger-Themen 8
M Java als Webanwendung mit Datenbank abfrage Java Basics - Anfänger-Themen 3
N Datenbank mit GUI verbinden - Wie? Java Basics - Anfänger-Themen 5
1 Datenbank in Java Java Basics - Anfänger-Themen 1
M Erste Schritte Java Applet - HTML Seiten auslesen und in Access Datenbank schreiben? Java Basics - Anfänger-Themen 15
J Bücher Datenbank Java Basics - Anfänger-Themen 5
S Best Practice MVC und große Datenmengen aus einer mySQL - Datenbank Java Basics - Anfänger-Themen 24
J Datum und Uhrzeit in Datenbank falsch hinterlegt Java Basics - Anfänger-Themen 13
R Erstversuch Datenbank Java Basics - Anfänger-Themen 6
I Daten speichern ohne Datenbank Java Basics - Anfänger-Themen 20
A Erste Schritte Verbindung zu MySQL Datenbank herstellen Java Basics - Anfänger-Themen 7
T Sql Datenbank - variable übergeben? Java Basics - Anfänger-Themen 8
C Passwörter möglichst sicher in Datenbank speichern Java Basics - Anfänger-Themen 18
W Erste Schritte Exceltabelle in Datenbank übertragen mittels XDEV Java Basics - Anfänger-Themen 7
J GUI mit phpMyAdmin Datenbank verbinden Java Basics - Anfänger-Themen 0
K Erste Schritte Datenbank SQL erklärung Java Basics - Anfänger-Themen 15
B Lokale Datenbank Java Java Basics - Anfänger-Themen 2
B Klassen Doppelte werte Filtern XML, Datenbank und DOM Java Basics - Anfänger-Themen 3
Todesbote Int Array mit Hibernate in Datenbank speichern. Java Basics - Anfänger-Themen 2
U Datenbank in Java Java Basics - Anfänger-Themen 8
M Keine Datenbank verbindung Java Basics - Anfänger-Themen 14
N mit Werten aus einer mysql datenbank in java rechnen Java Basics - Anfänger-Themen 17
Q Datenbank nicht über separaten Server Java Basics - Anfänger-Themen 4
B Dateiname in Datenbank schreiben Java Basics - Anfänger-Themen 2
J fortlaufende Objekte durch Variable auswählen; Datenbank Java Basics - Anfänger-Themen 4
S ArrayList in mysql Datenbank speichern Java Basics - Anfänger-Themen 6
C Datenbank - Welche Java Basics - Anfänger-Themen 5
B Java Objektorientierte Datenbank - Assoziation Hilfe Java Basics - Anfänger-Themen 4
G Input/Output Serialisierung oder Datenbank Java Basics - Anfänger-Themen 6
J Erste Schritte Objekte in Datenbank speichern Java Basics - Anfänger-Themen 26
A Android Datenbank gaaanz einfaches Insert geht nicht - warum? Java Basics - Anfänger-Themen 4
L Erste Schritte Datenbank Zugangsdaten sicher? Java Basics - Anfänger-Themen 15
S Input/Output Primzahlen Datenbank Java Basics - Anfänger-Themen 11
B Mit Java-Programm Daten aus MySQL-Datenbank auslesen, lokal und nicht lokal. Java Basics - Anfänger-Themen 10
K Input/Output Datenbank Java Basics - Anfänger-Themen 27
M Datenbank in die Gui Java Basics - Anfänger-Themen 4
J JTable mit Daten aus Datenbank füllen Java Basics - Anfänger-Themen 3
F Erfassung von PCs in eine SQLite-Datenbank über JDBC Java Basics - Anfänger-Themen 9
T Datenbank Abfrage Exception Null Java Basics - Anfänger-Themen 2
M Brauche ich ein Datenbank oder nicht? Java Basics - Anfänger-Themen 6

Ähnliche Java Themen


Oben