Comment récupérer le nombre total de lignes d'une requête avec TOP
-
03-07-2019 - |
Question
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. Le moyen le plus obscur est de faire une seconde requête
SELECT COUNT(*)
FROM T
WHERE ...
ORDER BY ...
Existe-t-il une méthode efficace?
Merci
La solution
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 (Édition: en utilisant WITH)
WITH cTotal AS
(
SELECT COUNT(*) AS bar FROM T WHERE ...)
)
SELECT TOP 10
*, cTotal .bar
FROM
T
WHERE
...
ORDER BY
...
Autres conseils
Le contenu de cette réponse semble fonctionner:
https://stackoverflow.com/a/19125458/16241
En gros, vous faites un:
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 cependant.
Lorsque j'ai testé cela, le plan de requête montrait que la table était touchée une seule fois.
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.
UPDATE: Si vous avez besoin d'une estimation, vous pouvez utiliser les métadonnées de statistiques:
SELECT rows
FROM dbo.sysindexes
WHERE name = @primary_key,
où @primary_key
est le nom de la clé primaire de votre table.
Ceci renverra le COUNT (*)
de la dernière mise à jour des statistiques.
SELECT TOP (2) *,
(SELECT COUNT(*) AS Expr1 FROM T) AS C
FROM T