PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Najlepszy sposób na uzyskanie liczby wyników przed zastosowaniem LIMIT

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.

  1. WHERE klauzula (i JOIN 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.

  1. Funkcje okna są stosowane w zależności od OVER klauzula i specyfikacja ramki funkcji. Proste count(*) OVER() opiera się na wszystkich kwalifikujących się wierszach.

  2. ORDER BY

( 6. DISTINCT lub DISTINCT ON trafiłbym tutaj.) Nie tutaj.

  1. 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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Błąd wartości podczas importowania danych do tabeli postgres za pomocą psycopg2

  2. Aktualizacja Slony-I 2.0.x do najnowszej wersji 2.1.x

  3. psql:serwer niespodziewanie zamknął połączenie

  4. 7 sposobów na znalezienie zduplikowanych wierszy w PostgreSQL, ignorując klucz podstawowy

  5. Jak odpytywać tablice jsonb za pomocą operatora IN