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