# zufällige Auswahl aus einer Tabelle



## JanHH (6. Mrz 2010)

Hallo,

bei meiner Applikation gibts eine Tabelle mit recht vielen Datensätzen, bis zu mehreren Millionen. Nach Einschränkung aufgrund gewisser Kriterien bleiben davon noch einige zehntausend übrig, die für eine Auswahl per Select-Statement valide sind, und nun besteht die Anforderung, aus den in Frage kommenden Datensätzen zufällig einen auszuwählen.

Die Frage ist, wie geht das?

Also soweit ich weiss..

- Es gibt beim SQL-Select keine "random"-Funktion

- Man kann keine zuverlässigen Annahmen darüber machen, in welcher Reihenfolge die Elemente im ResultSet vorliegen. Es liegt an der Laune der Datenbank, ausserdem verhalten sich die verschiedenen Datenbanksysteme da auch unterschiedlich

- Wenn das ResultSet als Liste zurückgegeben wird (ich arbeite mit JPA/Hibernate), dann hat man in Wirklichkeit erstmal nur einen Pointer auf die Datenbank. Tatsächlich gelesen (und per JDBC übertragen) werden die Daten erst, wenn man die Liste iteriert.

Für eine zufällige Auswahl müsste man also die gesamte Liste lesen (oder zumindest bis zu einem vorher ausgewählten, zufälligen Index), was von der Performance erheblich schlechter wäre als einfach "das erste Element" zu nehmen. Dieses wiederum entspricht aber nicht der Anforderung "wirklich zufällig ausgewählt".

Was also tun? Wie löst man sowas normalerweise?

Gruß+Danke
Jan


----------



## Atze (6. Mrz 2010)

ich kann dir nicht wirklich weiterhelfen, außer vielleicht dir zu raten nen algo zu schreiben, der einfach über n random int einen zufällig aus deinem gelesenen resultset holt.


aber das:


JanHH hat gesagt.:


> - Man kann keine zuverlässigen Annahmen darüber machen, in welcher Reihenfolge die Elemente im ResultSet vorliegen. Es liegt an der Laune der Datenbank, ausserdem verhalten sich die verschiedenen Datenbanksysteme da auch unterschiedlich


halte ich für n gerücht!  bin zwar kein db-experte, aber bei mir kamen die bisher immer in der reihenfolge, in der ich sie erwartet hab. oder ich hatte immer glück!


----------



## JanHH (6. Mrz 2010)

Nein, das ist definitiv nicht so. Bei HSQLDB beispielsweise kommen die Entities in der Reihenfolge, in der man sie in die Tabelle geschrieben hat (also quasi nach dem Primärschlüssel sortiert), bei PostgreSQL bei meinen Versuchen mal so, mal so.. ziemlich durcheinander. Da gibts schon Unterschiede.


----------



## function (6. Mrz 2010)

Könntest du dir nicht einfach eine Zufallszahl erzeugen und dann so ein konstrukt
[sql]
SELECT
  *
FROM
  deineTabelle
WHERE
  deineBedingungen
LIMIT
  zufallsZahl,1
[/sql]


----------



## JanHH (6. Mrz 2010)

dat versteh isch nisch (Datenbank-Neuling..)


----------

