2015-03-05 15 views
13

Für Paginierung Zwecke, ich brauche eine Abfrage mit den LIMIT und OFFSET Klauseln ausführen. Aber ich brauche auch eine Zählung der Anzahl der Zeilen, die von dieser Abfrage ohne die LIMIT und OFFSET Klauseln zurückgegeben würde.Führen Sie eine Abfrage mit einem LIMIT/OFFSET und erhalten Sie auch die Gesamtzahl der Zeilen

Ich will laufen:

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

Und:

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

Zur gleichen Zeit. Gibt es eine Möglichkeit, dies zu tun, insbesondere eine Möglichkeit, Postgre zu optimieren, so dass es schneller ist, als beide einzeln ausgeführt werden?

Antwort

32

Ja. Mit einer einfachen Fensterfunktion:

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

Beachten Sie, dass die Kosten wesentlich höher sein werden als ohne die Gesamtzahl, aber immer noch günstiger als zwei separate Abfragen. Postgres muss eigentlich zählen alle Zeilen in beiden Fällen, die eine Kosten in Abhängigkeit von der Gesamtzahl der qualifizierenden Zeilen auferlegt. Details:

-4

Nr

Es gibt vielleicht einige kleine Gewinn Sie theoretisch über konnte gewinnen sie einzeln mit kompliziert genug Maschinen unter der Haube läuft. Wenn Sie jedoch wissen möchten, wie viele Zeilen einer Bedingung entsprechen, müssen Sie sie zählen und nicht nur eine begrenzte Teilmenge.

Verwandte Themen