# Datenbankabfrage mit einer Range



## lender (10. Mai 2012)

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


----------



## nillehammer (10. Mai 2012)

Ja, das geht. Die meisten DBMSe unterstützen das Schlüsselwort 
	
	
	
	





```
LIMIT
```
. Das begrenzt die Größe der Ergebnismenge. 
	
	
	
	





```
LIMIT 1000
```
 beschränkt die Größe also bspw. auf 1000. Für den Start gibt es entweder 
	
	
	
	





```
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 
	
	
	
	





```
WHERE id > <gemerkterWert>
```
 machen.


----------



## nillehammer (10. Mai 2012)

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


----------



## cmrudolph (14. Mai 2012)

nillehammer hat gesagt.:


> 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.


----------

