Wie die Gesamtzeilenanzahl einer Abfrage mit TOP abrufen
-
03-07-2019 - |
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
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