Frage

Ich habe eine SQL Server 2008 Abfrage

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

Ich mag auch die Gesamtzahl der Zeilen erhalten. Die obious Art und Weise ist eine zweite Abfrage machen

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

Gibt es eine effiziente Methode?

Danke

War es hilfreich?

Lösung

Haben Sie eine zweite Abfrage möchten?

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

oder

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
    ...

oder (Edit: mit WITH)

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

Andere Tipps

Was in dieser Antwort scheint zu funktionieren:

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

Im Grunde Sie tun ein:

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

Totalcount wird die Gesamtzahl der Zeilen haben. Es ist zwar in jeder Zeile aufgeführt.

Als ich das die Abfrage-Plan getestet wurde, zeigte nur der Tisch einmal getroffen zu werden.

Entfernen Sie die ORDER BY-Klausel aus der zweiten Abfrage als auch.

Nein.

SQL Server nicht COUNT(*) in Metadaten wie MyISAM nicht halten, berechnet sie es jedes Mal.

UPDATE: Wenn Sie eine Schätzung benötigen, können Sie Statistiken Metadaten verwenden:

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

Dabei gilt @primary_key Tisch Primärschlüssel Name ist.

Das wird die COUNT(*) von den letzten Statistik-Update zurück.

SELECT     TOP (2) *,
           (SELECT COUNT(*) AS Expr1 FROM T) AS C
FROM         T
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top