Domanda

Ho una query di SQL Server 2008

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

Vorrei ottenere anche il numero totale delle righe. Il modo ossessivo è fare una seconda query

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

Esiste un metodo efficiente?

Grazie

È stato utile?

Soluzione

Vuoi una seconda query?

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

o

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

Oppure (Modifica: usando WITH)

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

Altri suggerimenti

Ciò che sta in questa risposta sembra funzionare:

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

Fondamentalmente fai un:

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

TotalCount avrà il numero totale di righe. È elencato su ogni riga però.

Quando l'ho provato, il piano di query ha mostrato che la tabella veniva colpita una sola volta.

Rimuovi anche la clausola ORDER BY dalla seconda query.

No.

SQL Server non mantiene COUNT (*) in metadati come MyISAM , lo calcola ogni volta.

AGGIORNAMENTO: Se hai bisogno di un preventivo, puoi utilizzare i metadati statistici:

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

dove @primary_key è il nome della chiave primaria della tabella.

Questo restituirà il COUNT (*) dall'ultimo aggiornamento delle statistiche.

SELECT     TOP (2) *,
           (SELECT COUNT(*) AS Expr1 FROM T) AS C
FROM         T
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top