2015-03-05 11 views
13

Per scopi di impaginazione, è necessario eseguire una query con le clausole LIMIT e OFFSET. Ma ho anche bisogno di un conteggio del numero di righe che verrebbero restituite da quella query senza le clausole LIMIT e OFFSET.Eseguire una query con LIMIT/OFFSET e ottenere anche il numero totale di righe

voglio correre:

SELECT * FROM table WHERE /* whatever */ ORDER BY col1 LIMIT ? OFFSET ? 

E:

SELECT COUNT(*) FROM table WHERE /* whatever */ 

Allo stesso tempo. C'è un modo per farlo, in particolare un modo che consente a Postgres di ottimizzarlo, in modo che sia più veloce rispetto all'esecuzione di entrambi individualmente?

risposta

32

Sì. Con una semplice funzione di finestra:

SELECT *, count(*) OVER() AS full_count 
FROM tbl 
WHERE /* whatever */ 
ORDER BY col1 
LIMIT ? 
OFFSET ?

essere consapevoli che il costo sarà notevolmente superiore a quello senza il numero totale, ma ancora più conveniente di due query separate. Postgres deve in realtà contare tutte le righe in entrambi i casi, il che impone un costo in base al numero totale di righe qualificanti. Dettagli:

-4

No.

C'è forse qualche piccolo guadagno si potrebbe teoricamente guadagnare su di loro in esecuzione individualmente con macchinari abbastanza complicato sotto il cofano. Ma, se vuoi sapere quante righe corrispondono a una condizione, dovrai contarle piuttosto che solo un sottoinsieme LIMITATO.