SQL puro
Le cose sono cambiate dal 2008. Puoi usare una funzione finestra per ottenere il conteggio completo e il risultato limitato in una query. Introdotto con PostgreSQL 8.4 nel 2009.
SELECT foo
, count(*) OVER() AS full_count
FROM bar
WHERE <some condition>
ORDER BY <some col>
LIMIT <pagesize>
OFFSET <offset>;
Tieni presente che questo può essere notevolmente più costoso rispetto al conteggio totale . Tutte le righe devono essere contate e una possibile scorciatoia che prenda solo le prime righe da un indice corrispondente potrebbe non essere più utile.
Non importa molto con le tabelle piccole o full_count
<=OFFSET
+ LIMIT
. Conta per un full_count
sostanzialmente più grande .
Custodia angolare :quando OFFSET
è almeno pari al numero di righe della query di base, nessuna riga viene restituito. Quindi non ottieni nemmeno full_count
. Possibile alternativa:
- Esegui una query con un LIMIT/OFFSET e ottieni anche il numero totale di righe
Sequenza di eventi in un SELECT
domanda
( 0. I CTE vengono valutati e materializzati separatamente. In Postgres 12 o successivo il pianificatore può incorporare quelli come le sottoquery prima di andare al lavoro.) Non qui.
WHERE
clausola (eJOIN
condizioni, sebbene nessuna nell'esempio) filtra le righe di qualificazione dalle tabelle di base. Il resto si basa sul sottoinsieme filtrato.
( 2. GROUP BY
e le funzioni aggregate andrebbero qui.) Non qui.
( 3. Altro SELECT
le espressioni elenco vengono valutate, in base a colonne raggruppate/aggregate.) Non qui.
-
Le funzioni della finestra vengono applicate in base a
OVER
clausola e la specifica del frame della funzione. Il semplicecount(*) OVER()
si basa su tutte le righe qualificanti. -
ORDER BY
( 6. DISTINCT
o DISTINCT ON
andrebbe qui.) Non qui.
LIMIT
/OFFSET
vengono applicati in base all'ordine stabilito per selezionare le righe da restituire.
LIMIT
/ OFFSET
diventa sempre più inefficiente con un numero crescente di righe nella tabella. Considera approcci alternativi se hai bisogno di prestazioni migliori:
- Ottimizza la query con OFFSET su una tabella di grandi dimensioni
Alternative per ottenere il conteggio finale
Esistono approcci completamente diversi per ottenere il conteggio delle righe interessate (non il conteggio completo prima di OFFSET
&LIMIT
sono stati applicati). Postgres ha una contabilità interna su quante righe sono state interessate dall'ultimo comando SQL. Alcuni client possono accedere a tali informazioni o contare le righe da soli (come psql).
Ad esempio, puoi recuperare il numero di righe interessate in plpgsql subito dopo aver eseguito un comando SQL con:
GET DIAGNOSTICS integer_var = ROW_COUNT;
Dettagli nel manuale.
Oppure puoi usare pg_num_rows
in PHP . O funzioni simili in altri client.
Correlati:
- Calcola il numero di righe interessate dalla query batch in PostgreSQL