Datenbankabfrage mit einer Range

  • Themenstarter Themenstarter lender
  • Beginndatum Beginndatum
L

lender

Gast
Hallo zusammen,

ich frage mich grade ob ich nicht ein SQL Script erweitern kann. Leider weis ich nicht wie das geht aber es sollte möglich sein.

Das Folgende Problem:

Ich joine 3 Tabellen zusammen und gleiche diese miteinander ab. Da die Tabellen alle etliche Einträge haben muss ich diese mit einer Range eingrenzen. z.b. 1000.

Kann das Script nicht soweit erweitert werden, dass wenn Datensatz 1000 erreicht wird setzte die range von 2000-3000, usw.?

Also er soll eig das Script neustarten mit neuen Parametern.

Danke für Lösungsansätze. Eigentlich will ich nur Wissen ob das geht und nach welchen Befehlen ich google muss.

Grüße
 
Ja, das geht. Die meisten DBMSe unterstützen das Schlüsselwort
Code:
LIMIT
. Das begrenzt die Größe der Ergebnismenge.
Code:
LIMIT 1000
beschränkt die Größe also bspw. auf 1000. Für den Start gibt es entweder
Code:
OFFSET
oder Du baust Dir was eigenes. Wenn die Ergebnisse z.B. nach IDs sortiert sind, könntest Du Dir die größte ID der letzten Abfrage merken und dann ein
Code:
WHERE id > <gemerkterWert>
machen.
 
Auch, wenn das mit den gemerkten Werten zunächst komplizierter Erscheint, würde ich das an Deiner Stelle bevorzugen. Ich habe bei hsql mal einen Test mit OFFSET gemacht und mir den Execution Path anzeigen lassen. Da war ein Full Table Scan dabei, bei der Variante mit Ids nicht. Full Table Scans sind bei großen Datenmengen ein Performance-Killer
 
Auch, wenn das mit den gemerkten Werten zunächst komplizierter Erscheint, würde ich das an Deiner Stelle bevorzugen. Ich habe bei hsql mal einen Test mit OFFSET gemacht und mir den Execution Path anzeigen lassen. Da war ein Full Table Scan dabei, bei der Variante mit Ids nicht. Full Table Scans sind bei großen Datenmengen ein Performance-Killer
Ergänzend dazu vielleicht noch eine Begründung, weshalb die Lösung mit der id schneller ist (also id > x LIMIT 1000):
Über der id-Spalte liegt normalerweise ein Index. Daher ist es sehr effizient den Beginn der zu ermittelnden Ergebnismenge zu bekommen. Das Ergebnis wird dann sofort zurückgegeben, sobald die ersten 1000 Ergebnisse gefunden wurden. Es werden also genau 1000 Zeilen ausgelesen und zurückgegeben.
Wenn man LIMIT mit OFFSET verwendet, müssen auch die Ergebnisse vor dem Offset alle ermittelt werden und dann werden sie sofort wieder verworfen. Es werden also OFFSET + 1000 Zeilen ausgelesen und 1000 Zeilen zurückgegeben.
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben