comment SÉLECTIONNER les œuvres, lorsqu'aucune commande n'est spécifiée?
La la documentation msdn dit que lorsque nous écrire
SELECT TOP(N) ..... ORDER BY [COLUMN]
Nous obtenons top(n) lignes sont triées par column
(asc
ou desc
en fonction de ce que nous choisissons)
Mais si l'on ne spécifie pas toute ordonnance, msdn dit random
comme Gail Erickson
souligné ici. Comme il le souligne, il devrait être unspecified
plutôt random
. Mais comme
points qui
Thomas Lee
Quand l'écran est utilisé en conjonction avec la clause ORDER BY, le résultat
jeu est limitée à la première N nombre de lignes ordonnées; sinon, il
retourne les N premières lignes aléatoire
Donc, j'ai couru à cette requête sur une table qui n'ont pas des indices, j'ai d'abord couru ce..
SELECT *
FROM
sys.objects so
WHERE
so.object_id NOT IN (SELECT si.object_id
FROM
sys.index_columns si)
AND so.type_desc = N'USER_TABLE'
Et ensuite dans l'une de ces tables, (en fait j'ai essayé la requête ci-dessous, dans tous les tableaux retournés par la requête ci-dessus) et j'ai toujours eu les mêmes lignes.
SELECT TOP (2) *
FROM
MstConfigSettings
Ce retourne toujours le même 2 lignes, et le même est vrai pour tous les autres tableaux retournés par la requête 1. Maintenant, les plans d'exécution montre 3 étapes..
Comme vous pouvez le voir il n'y a pas d'indice de regarder vers le haut, c'est juste une pure analyse de la table, et
La Top
montre que les pas de lignes à 2, et ainsi de la Table Scan
; ce Qui n'est pas le cas (là, j'ai beaucoup de lignes).
Mais quand je lance quelque chose comme
SELECT TOP (2) *
FROM
MstConfigSettings
ORDER BY
DefaultItemId
Le plan d'exécution montre
et
Donc, quand je ne suis pas d'appliquer ORDER BY
les étapes sont différentes (il n'y a pas de tri). Mais la question est de savoir comment cette TOP
fonctionne quand il n'y a pas de Sort
et pourquoi et comment il toujours donne le même résultat?
- Je pensais que c'était juste commandé par la date à laquelle ils ont été ajoutés dans la base de données? Les plus anciens en premier.
- il dépend du sgbd mise en œuvre, de sorte 'top' sans 'order by' est définie par l'implémentation de la fonctionnalité
TOP
n'est pas le standard SQL et de toute façon la question est balisé de SQL Server.
Vous devez vous connecter pour publier un commentaire.
Il n'y a aucune garantie qui deux lignes que vous obtenez. Ce sera juste les deux premières extraites à partir de l'analyse de la table.
La
TOP
itérateur dans le plan d'exécution sera de cesser de demander lignes une fois que les deux ont été retournés.Probablement pour une analyse d'un segment de mémoire ce sera la première deux lignes dans l'ordre d'allocation, mais ce n'est pas garanti. Par exemple, SQL Server peut utiliser le les fonctions de numérisation avancées fonctionnalité qui signifie que votre analyse va lire les pages récemment lu à partir d'un autre simultanées d'analyse.
ORDER BY NEWID()
par exemple. C'est pourquoi, la documentation a été modifiée pour dire "non défini" non pas aléatoire.