Führen Sie eine Abfrage mit einem LIMIT / OFFSET aus und erhalten Sie auch die Gesamtzahl der Zeilen
Für die Paginierung Zwecke, brauche ich eine Abfrage, ausführen mit die LIMIT
und OFFSET
Klauseln. Aber ich brauche auch die Anzahl der Zeilen, die zurückgegeben werden, indem Sie die Abfrage ohne die LIMIT
und OFFSET
Klauseln.
Möchte ich 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, das zu tun, insbesondere auf eine Weise, die Postgres optimieren, so dass es ist schneller als laufen beide einzeln?
InformationsquelleAutor der Frage Tim | 2015-03-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja. Mit einem einfachen window-Funktion:
Sich bewusst sein, dass die Kosten wesentlich höher sein als ohne die Gesamtzahl, aber immer noch billiger als zwei separate Abfragen. Postgres hat die eigentlich zählen Sie alle Zeilen in jedem Fall, die auferlegt, die Kosten abhängig von der Gesamtzahl der qualifizierten Zeilen. Details:
Jedochals Dani hingewiesenwenn
OFFSET
ist mindestens so groß wie die Anzahl der Zeilen zurückgegeben, die von der base-Abfrage keine Zeilen zurückgegeben werden. Also wir bekommen auch nicht diefull_count
.Wenn das nicht akzeptabel ist, eine mögliche Problemumgehung, die immer wieder die volle Zahl wäre mit einem CTE und eine
OUTER JOIN
:Erhalten Sie eine Reihe von NULL-Werten mit der
full_count
angefügt, wennOFFSET
ist zu groß. Oder es ist angefügt, um jede Zeile wie in der ersten Abfrage.Wenn eine Zeile, die mit allen von NULL-Werten ist eine mögliche gültiges Ergebnis Sie haben zu prüfen
offset >= full_count
keine Verwechslungen der Ursprung der leeren Zeile.Diese noch führt die base-query nur einmal. Aber es fügt mehr Aufwand, um die Abfrage und zahlt nur wenn das weniger als die Wiederholung der Basis-Abfrage, die für die Zählung.
Wenn Indizes unterstützen die endgültige Sortierung zur Verfügung, die es bezahlen konnten, gehören die
ORDER BY
im CTE (Redundant).InformationsquelleAutor der Antwort Erwin Brandstetter
Nicht.
Gibt es vielleicht ein paar kleinen gewinnen, theoretisch könnten Sie gewinnen über die Ausführung individuell mit genug komplizierte Maschinen unter der Haube. Aber, wenn Sie wissen möchten, wie viele Zeilen entsprechen einer Bedingung, die Sie haben zu zählen, anstatt nur eine Eingeschränkte Teilmenge.
InformationsquelleAutor der Antwort Richard Huxton