Czysty SQL
Sytuacja zmieniła się od 2008 roku. Możesz użyć funkcji okna, aby uzyskać pełną liczbę i ograniczony wynik w jednym zapytaniu. Wprowadzony z PostgreSQL 8.4 w 2009 roku.
SELECT foo
, count(*) OVER() AS full_count
FROM bar
WHERE <some condition>
ORDER BY <some col>
LIMIT <pagesize>
OFFSET <offset>;
Pamiętaj, że to może być znacznie droższe niż bez całkowitej liczby . Wszystkie wiersze muszą być policzone, a możliwy skrót pobierający tylko górne wiersze z pasującego indeksu może już nie być pomocny.
Nie ma większego znaczenia w przypadku małych tabel lub full_count
<=OFFSET
+ LIMIT
. Ma znaczenie dla znacznie większego full_count
.
Przypadek narożny :kiedy OFFSET
jest co najmniej tak duża, jak liczba wierszy z zapytania podstawowego, brak wiersza jest zwracany. Więc nie otrzymujesz również full_count
. Możliwa alternatywa:
- Uruchom zapytanie z LIMIT/OFFSET, a także uzyskaj całkowitą liczbę wierszy
Sekwencja zdarzeń w SELECT
zapytanie
(0. CTE są oceniane i materializowane oddzielnie. W Postgres 12 lub nowszych planista może wstawić takie, jak podzapytania przed przystąpieniem do pracy.) Nie tutaj.
WHERE
klauzula (iJOIN
warunki, chociaż żadne w twoim przykładzie) filtrują kwalifikujące się wiersze z tabel podstawowych. Reszta jest oparta na filtrowanym podzbiorze.
( 2. GROUP BY
i funkcje agregujące trafią tutaj.) Nie tutaj.
( 3. Inne SELECT
Wyrażenia listy są oceniane na podstawie zgrupowanych / zagregowanych kolumn.) Nie tutaj.
-
Funkcje okna są stosowane w zależności od
OVER
klauzula i specyfikacja ramki funkcji. Prostecount(*) OVER()
opiera się na wszystkich kwalifikujących się wierszach. -
ORDER BY
( 6. DISTINCT
lub DISTINCT ON
trafiłbym tutaj.) Nie tutaj.
LIMIT
/OFFSET
są stosowane w oparciu o ustaloną kolejność wybierania wierszy do zwrócenia.
LIMIT
/ OFFSET
staje się coraz bardziej nieefektywny wraz ze wzrostem liczby wierszy w tabeli. Rozważ alternatywne podejścia, jeśli potrzebujesz lepszej wydajności:
- Zoptymalizuj zapytanie z PRZESUNIĘCIEM na dużym stole
Alternatywy, aby uzyskać ostateczną liczbę
Istnieją zupełnie inne podejścia do obliczenia liczby wierszy, których dotyczy problem (nie pełna liczba przed OFFSET
&LIMIT
Zostały zastosowane). Postgres posiada wewnętrzną księgowość, na ile wierszy miało wpływ ostatnie polecenie SQL. Niektórzy klienci mogą uzyskać dostęp do tych informacji lub samodzielnie zliczać wiersze (np. psql).
Na przykład możesz pobrać liczbę wierszy, których dotyczy problem, w plpgsql natychmiast po wykonaniu polecenia SQL z:
GET DIAGNOSTICS integer_var = ROW_COUNT;
Szczegóły w instrukcji.
Możesz też użyć pg_num_rows
w PHP . Lub podobne funkcje w innych klientach.
Powiązane:
- Oblicz liczbę wierszy, na które wpływa zapytanie wsadowe w PostgreSQL