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

Était-ce utile?

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,

@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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top