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

commander par newid() - comment ça marche ?

Je sais ce que fait NewID(), j'essaie juste de comprendre comment cela aiderait la sélection aléatoire. Est-ce que (1) l'instruction de sélection sélectionnera TOUT dans ma table, (2) pour chaque ligne sélectionnée, ajoutera un identifiant unique généré par NewID (), (3) triera les lignes par cet identifiant unique et (4) sélectionnera les 100 premières de la liste triée ?

Oui. c'est à peu près exactement correct (sauf qu'il n'est pas nécessairement nécessaire de trier tous les rangées). Vous pouvez le vérifier en consultant le plan d'exécution réel.

SELECT TOP 100 * 
FROM master..spt_values 
ORDER BY NEWID()

L'opérateur scalaire de calcul ajoute le NEWID() colonne pour chaque ligne (2506 dans le tableau de mon exemple de requête), les lignes du tableau sont triées par cette colonne avec les 100 premières sélectionnées.

SQL Server n'a pas réellement besoin de trier l'ensemble complet à partir des positions 100 vers le bas, il utilise donc un TOP N opérateur de tri qui tente d'effectuer toute l'opération de tri en mémoire (pour les petites valeurs de N )