C'est une question connue mais la meilleure solution que j'ai trouvée est quelque chose comme:
SELECT TOP N *
FROM MyTable
ORDER BY Id DESC
J'ai une table avec beaucoup de lignes. Il n'est pas possible d'utiliser cette requête car cela prend beaucoup de temps. Alors, comment puis-je faire pour sélectionner les N dernières lignes sans utiliser ORDER BY?
ÉDITER
Désolé, question dupliquée de celle-ci
id
est indexé, il analysera simplement cet index en sens inverse et s'arrêtera après les 5 premières lignes. S'il n'est pas indexé, il devra effectuer unTOP N
tri. Ce ne sera pas pire que toute autre façon de le faire. Il ne trie pas la table entière (bien qu'il faudrait scanner la table entière)Réponses:
Vous pouvez le faire en utilisant également la fonction NUMÉRO DE RANGÉE PAR PARTITION. Un bon exemple peut être trouvé ici :
la source
Vous pouvez faire en sorte que le serveur SQL sélectionne les N dernières lignes à l'aide de ce SQL:
la source
J'ai testé le code de JonVD, mais j'ai trouvé qu'il était très lent, 6s.
Ce code a pris 0s.
la source
OrderDate
indexé, il devrait être tout aussi rapide de sélectionner la première ou la dernière N lignes d'une requête. Je me rends compte qu'il y a une chance que laOrderDate
commande insérée soit bien corrélée, mais c'est au mieux un effet secondaire, et cela nécessite toujours une analyse de la table, non? (Et je ne pense pas que cela réponde à ce que l'OP indique comme une dupe mieux formulée de leur question : c'est-à-dire sans trier)Si vous souhaitez sélectionner les derniers nombres de lignes d'une table.
La syntaxe sera comme
Ces déclarations fonctionnent mais de manières différentes. Merci les gars.
de cette façon, vous pouvez obtenir les 10 dernières lignes mais l'ordre montrera le chemin de la description
la source
D'une manière très générale et pour prendre en charge le serveur SQL, voici
et pour les performances, c'est pas mal (moins d'une seconde pour plus de 10000 enregistrements sur machine serveur)
la source
"Id" est-il indexé? Sinon, c'est une chose importante à faire (je soupçonne qu'elle est déjà indexée).
De plus, devez-vous renvoyer TOUTES les colonnes? Vous pourrez peut-être obtenir une amélioration substantielle de la vitesse si vous n'avez réellement besoin que d'un sous-ensemble plus petit de colonnes qui peut être COMPLÈTEMENT pris en charge par l'index sur la colonne ID - par exemple si vous avez un index NON CLUSTERED sur la colonne Id, sans autre champs inclus dans l'index, il faudrait alors effectuer une recherche sur l'index clusterisé pour obtenir le reste des colonnes à renvoyer et cela pourrait représenter une grande partie du coût de la requête. S'il s'agit d'un index CLUSTERED ou d'un index NONCLUSTERED qui inclut tous les autres champs que vous souhaitez renvoyer dans la requête, tout devrait bien se passer.
la source
D'abord, vous obtenez le plus grand nombre de records
Puis :
Dans SQL Server 2012
Dans SQL Server 2008
la source
Voici quelque chose que vous pouvez essayer sans
order by
mais je pense que cela nécessite que chaque ligne soit unique.N
est le nombre de lignes que vous voulez,L
est le nombre de lignes du tableau.Comme indiqué précédemment, les lignes renvoyées ne sont pas définies.
EDIT: c'est en fait un chien lent. Vraiment sans valeur.
la source
la source
Cette requête renvoie les N dernières lignes dans le bon ordre, mais ses performances sont médiocres
la source
utilisez desc avec orderby à la fin de la requête pour obtenir les dernières valeurs.
la source
Cela ne correspond peut-être pas tout à fait à la question, mais…
Clause OFFSET
La
OFFSET number
clause vous permet de sauter un nombre de lignes, puis de renvoyer des lignes après cela.Ce lien doc est vers Postgres; Je ne sais pas si cela s'applique à Sybase / MS SQL Server.
la source
la source
MS ne prend pas en charge LIMIT dans t-sql. La plupart du temps, j'obtiens simplement MAX (ID), puis je soustrais.
Cela renverra moins de 10 enregistrements lorsque l'ID n'est pas séquentiel.
la source
Une technique que j'utilise pour interroger les lignes LES PLUS RÉCENTES dans les très grandes tables (100+ millions ou 1+ milliard de lignes) limite la requête à "lire" uniquement le pourcentage "N" le plus récent de RANGÉES RÉCENTES. Il s'agit d'applications du monde réel, par exemple, je le fais pour des données météorologiques récentes non historiques, des recherches récentes de fil d'actualité ou des données de point de données de localisation GPS récentes.
Il s'agit d'une énorme amélioration des performances si vous savez avec certitude que vos lignes sont dans les 5% les plus récents du tableau par exemple. De telle sorte que même s'il y a des index sur les tables, cela limite encore les possibilités à seulement 5% des lignes dans les tables qui ont 100+ millions ou 1+ milliard de lignes. C'est particulièrement le cas lorsque des données plus anciennes nécessitent des lectures de disque physique et pas seulement des lectures logiques en mémoire .
C'est bien plus efficace que SELECT TOP | PERCENT | LIMIT car il ne sélectionne pas les lignes, mais limite simplement la partie des données à rechercher.
la source
Pour afficher les 3 dernières lignes sans utiliser
order by
:la source
Essayez d'utiliser la
EXCEPT
syntaxe.Quelque chose comme ça:
la source
Peut-être un peu tard, mais voici une simple sélection qui résout votre question.
la source