Gibt es eine prägnante Möglichkeit, einen zufälligen Datensatz aus einer SQL-Server-Tabelle abzurufen?
Ja
SELECT TOP 1 * FROM table ORDER BY NEWID()
Erklärung
Eine NEWID()
wird für jede Zeile generiert und die Tabelle danach sortiert. Der erste Datensatz wird zurückgegeben (d. h. der Datensatz mit der "niedrigsten" GUID).
Notizen
-
GUIDs werden seit Version vier als Pseudozufallszahlen generiert:
Die UUID der Version 4 ist zum Generieren von UUIDs aus echten Zufalls- oder Pseudo-Zufallszahlen gedacht.
Der Algorithmus ist wie folgt:
- Setzen Sie die beiden höchstwertigen Bits (Bits 6 und 7) von theclock_seq_hi_and_reserved auf null bzw. eins.
- Setzen Sie die vier höchstwertigen Bits (Bits 12 bis 15) des Felds time_hi_and_version auf die 4-Bit-Versionsnummer aus Abschnitt 4.1.3.
- Setze alle anderen Bits auf zufällig (oder pseudozufällig) gewählte Werte.
– Ein UUID-URN-Namespace (Universally Unique IDentifier) – RFC 4122
-
Die Alternative
SELECT TOP 1 * FROM table ORDER BY RAND()
wird nicht funktionieren, wie man denken würde.RAND()
gibt einen einzigen Wert pro Abfrage zurück, daher haben alle Zeilen denselben Wert. -
Obwohl GUID-Werte pseudozufällig sind, benötigen Sie für anspruchsvollere Anwendungen einen besseren PRNG.
-
Die typische Leistung beträgt weniger als 10 Sekunden für etwa 1.000.000 Zeilen – natürlich abhängig vom System. Beachten Sie, dass es unmöglich ist, einen Index zu treffen, daher ist die Leistung relativ begrenzt.