Comment faire pour récupérer le total du nombre de lignes d'une requête avec le HAUT
J'ai une requête SQL Server 2008
SELECT TOP 10 *
FROM T
WHERE ...
ORDER BY ...
J'aimerais avoir aussi le nombre total de lignes. Le obious façon est de faire une deuxième requête
SELECT COUNT(*)
FROM T
WHERE ...
ORDER BY ...
Est-il une méthode efficace?
Grâce
OriginalL'auteur | 2009-03-04
Vous devez vous connecter pour publier un commentaire.
Voulez-vous une deuxième requête?
OU
Ou (Edit: de l'utiliser AVEC)
Des exemples 1 et 3 sont de simples requêtes et fonctionnellement identiques.
Ok, je veux dire que je voudrais éviter un deuxième "analyse de la table". Je voudrais faire le moteur de scan seulement une fois que la table, afin de récupérer le nombre total et le n lignes.
Vous ne pouvez pas. Ils sont 2 différentes constructions de requête. Le COMTE va effectivement être très efficace, probablement plus que la requête principale, car il sera utiliser le plus efficace
OriginalL'auteur gbn
Qu'est-ce que dans cette réponse semble fonctionner:
https://stackoverflow.com/a/19125458/16241
Fondamentalement, vous faites un:
TotalCount aura le nombre total de lignes. Elle est inscrite sur chaque ligne.
Quand je l'ai testé ce le plan de requête a montré la table que d'être frappé une fois.
OriginalL'auteur Vaccano
Supprimer la clause ORDER BY à partir de la 2ème requête.
OriginalL'auteur Joel Coehoorn
Pas.
SQL Server
permet de ne pas garderCOUNT(*)
dans les métadonnées commeMyISAM
, il calcule à chaque fois.Mise à JOUR: Si vous avez besoin d'une estimation, vous pouvez utiliser les statistiques de métadonnées:
où
@primary_key
est de votre table de clé primaire nom.Ce sera le retour de la
COUNT(*)
de la dernière mise à jour des statistiques.OH, j'ai juste répondu à ma propre question...SQL_CALC_FOUND_ROWS et FOUND_ROWS() fait le travail..merci!
OriginalL'auteur Quassnoi
Je n'ai pas profilé cela, mais je pense que ce serait en fait plus lent, car il est dans une sous-requête et retourné dans chaque ligne. Je ne suis pas un gourou bien, le serveur est peut-être assez intelligent pour mettre en cache. Même encore, je ne pense pas qu'il serait tout rapide que les deux requêtes, car il est toujours en cours d'exécution.
OriginalL'auteur Learning