Ergebnis Teilmenge SQL Abfrage

Peter Parker

Mitglied
Hallo Zusammen,

ich habe eine Datenbank (mySQL) mit 8 Tabellen. Diese Tabellen sind mit jeweils min. 5000 Datensätze befüllt. Wenn mein ich nun eine SQL Abfrage ausführe, wobei ich die Tabellen miteinander Joinen muss, dauert es einige Minuten bis ich meine Ergebnismenge erhalte und anzeigen kann.

Gibt es vielleicht eine Möglichkeit, dass ich ggf. bereits ein paar Teil Ergebnisse erhalten und anzeigen kann, bis die Abfrage komplett abgearbeitet ist? Oder soll ich zuerst eine Abfrage starten die mir eben nur die ersten 100 Ergebnise liefert, diese zeige ich an und im Hintergrund starte ich eine zweite Abfrage die mir alle Daten liefert.

Die Programmiersprache ist eigentlich egal. Ich verwende derzeit C/C++ aber würde auch Lösungen in anderen Sprachen in betracht ziehen.

Vielleicht hatte jemand mal ein gleiches Problem, bin Dankbar über jede Hilfe.
 
Meines Wissens kannst Du die Ergebnisse nicht vor Beendigung des Querys abfragen.
Eine "selbst blätternde Blätterfunktion" wird im Ganzen vermutlich etwas langsamer sein, aber Du könntest einzelne Ergebnisse bereits vorher abfragen.
Pseudo Code:
Code:
i=0
hasresult=true
while (hasresult)
  query mit limit i * 100, 100
  hasresult = false
  while (noch eine zeile)
    zeile hinschreiben
    hasresult = true
  end while
  i++
end while
Du könntest aber auch versuchen Deine Datenbank zu optimieren (index etc.).
Ausserdem könnte die Änderung der Join-Reihenfolge ("echte" Joins, nicht Tabellen mit Kommata trennen) Geschwindigkeitsvorteile bringen.
Einige Minuten finde ich ganz schön lang (wenn es kein 100 Mhz-Server ist), ich denke, da ist noch Optimierungspotenzial beim Query.
 
Verstehe nicht ganz wie "selbst blätternde Blätterfunktion" eine Cursor Funktion wie in JAVA? im Resultset? An der DB kann ich nicht mehr viel optimieren und würde es leiber im Code versuchen!

Danke
 
Mit selbstblätternd meinte ich das, was ich in dem Pseudo-Code geschrieben habe.
Ich habe mich da mit Sicherheit schlecht ausgedrückt, mir viel nur nichts besseres ein und ich hoffte, dass der Code alle Unklarheiten beseitigt.
Normalerweise werden bei einer Blätterfunktion (i.d.R. für HTML-Seiten) die Ergebnisse ja auf mehrere Seiten verteilt. Das Prinzip ist es hier dasselbe, es wird nämlich eine große Anzahl Zeilen auf mehrere einzelne Querys verteilt. Ich habe es mir nur so gedacht, dass dies in einer Schleife passiert und keine Aktion des User benötigt. Somit würdest Du die ersten 100 Ergebnisse ausgeben und dann erst die nächsten 100 abfragen. Das war als Alternative zu "bereits ein paar Teil Ergebnisse erhalten und anzeigen" gedacht, da dies meines Wissens nicht mit einem einzelnen Query geht. Habe ich Dich jetzt noch mehr irritert? Sorry, falls ja.
Was waterhouse sagt, kann auch gut sein. Ein Versuch ohne Ausgabe mit einer einfachen Meldung, wenn alles ausgelesen ist, sollte Dir darüber Aufschluss geben, ob es an der Anzeige liegt oder an MySQL. Auf welche Weise zeigst Du die Ergebnisse denn an?
Wie gesagt, halte ich es für unwahrscheinlich, dass MySQL zum Ausführen des Querys und herausgeben der Ergebnisse mehrere Minuten braucht, wenn das Query und die DB einigermaßen sinnvoll geschrieben sind. Wenn Abfragen die Änderungen überwiegen und es tatsächlich an MySQL liegt, könnte hier der MySQL-Query-Cache auch erhebliche Vorteile bringen.

Gruß hpvw
 
Zurück