Comment récupérer le nombre total de lignes d'une requête avec TOP

J'ai une requête SQL Server 2008

SELECT TOP 10 * FROM T WHERE ... ORDER BY ... 

J'aimerais aussi connaître le nombre total de lignes. La manière la plus abjecte est de faire une seconde requête

 SELECT COUNT(*) FROM T WHERE ... ORDER BY ... 

Y a-t-il une méthode efficace?

Merci

Voulez-vous une deuxième requête?

 SELECT TOP 10 *, foo.bar FROM T CROSS JOIN (SELECT COUNT(*) AS bar FROM T WHERE ...) foo WHERE ... ORDER BY ... 

OU

 DECLARE @bar int SELECT @bar = COUNT(*) AS bar FROM T WHERE ... SELECT TOP 10 *, @bar FROM T CROSS JOIN (SELECT COUNT(*) AS bar FROM T WHERE ...) foo WHERE ... ORDER BY ... 

Ou (Edit: en utilisant WITH)

 WITH cTotal AS ( SELECT COUNT(*) AS bar FROM T WHERE ...) ) SELECT TOP 10 *, cTotal .bar FROM T WHERE ... ORDER BY ... 

Supprimez également la clause ORDER BY de la deuxième requête.

Non.

SQL Server ne conserve pas COUNT(*) dans les métadonnées comme MyISAM , il le calcule à chaque fois.

MISE À JOUR: Si vous avez besoin d'une estimation, vous pouvez utiliser les métadonnées statistics:

 SELECT rows FROM dbo.sysindexes WHERE name = @primary_key, 

@primary_key est le nom de key primaire de votre table.

Cela renverra le COUNT(*) partir de la dernière mise à jour des statistics.

Ce qui est dans cette réponse semble fonctionner:

https://stackoverflow.com/a/19125458/16241

Fondamentalement, vous faites:

 SELECT top 100 YourColumns, TotalCount = Count(*) Over() From YourTable Where SomeValue = 32 

TotalCount aura le nombre total de lignes. Il est répertorié sur chaque ligne si.

Lorsque j'ai testé cela, le plan de requête montrait que la table n'était touchée qu'une seule fois.

 SELECT TOP (2) *, (SELECT COUNT(*) AS Expr1 FROM T) AS C FROM T 

Use Sub query Au lieu de cela, c'est une option rapide et meilleure. voici la requête

 SELECT TOP 10 * , foo.bar ,(SELECT count(*) FROM T) FROM T