Existe-t-il un moyen succinct de récupérer un enregistrement aléatoire à partir d'une table de serveur SQL ?
Oui
SELECT TOP 1 * FROM table ORDER BY NEWID()
Explication
Un NEWID()
est généré pour chaque ligne et le tableau est ensuite trié en fonction de celle-ci. Le premier enregistrement est renvoyé (c'est-à-dire l'enregistrement avec le GUID "le plus bas").
Remarques
-
Les GUID sont générés sous forme de nombres pseudo-aléatoires depuis la version 4 :
L'UUID version 4 est destiné à générer des UUID à partir de nombres véritablement aléatoires ou pseudo-aléatoires.
L'algorithme est le suivant :
- Définissez les deux bits les plus significatifs (bits 6 et 7) de theclock_seq_hi_and_reserved sur zéro et un, respectivement.
- Définissez les quatre bits les plus significatifs (bits 12 à 15) du champ time_hi_and_version sur le numéro de version à 4 bits de la section 4.1.3.
- Définissez tous les autres bits sur des valeurs choisies de manière aléatoire (ou pseudo-aléatoire).
—Un espace de noms d'URN d'identifiant unique universel (UUID) - RFC 4122
-
L'alternative
SELECT TOP 1 * FROM table ORDER BY RAND()
ne fonctionnera pas comme on pourrait le penser.RAND()
renvoie une seule valeur par requête, ainsi toutes les lignes partageront la même valeur. -
Bien que les valeurs GUID soient pseudo-aléatoires, vous aurez besoin d'un meilleur PRNG pour les applications les plus exigeantes.
-
Les performances typiques sont inférieures à 10 secondes pour environ 1 000 000 de lignes, bien sûr en fonction du système. Notez qu'il est impossible d'atteindre un index, les performances seront donc relativement limitées.