Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Enregistrement aléatoire d'une table de base de données (T-SQL)

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

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

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

  3. Bien que les valeurs GUID soient pseudo-aléatoires, vous aurez besoin d'un meilleur PRNG pour les applications les plus exigeantes.

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