sql >> Databáze >  >> RDS >> PostgreSQL

Nejlepší způsob, jak získat počet výsledků před použitím LIMIT

Čisté SQL

Od roku 2008 se věci změnily. K získání úplného počtu můžete použít funkci okna a omezený výsledek v jednom dotazu. Představeno s PostgreSQL 8.4 v roce 2009.

SELECT foo
     , count(*) OVER() AS full_count
FROM   bar
WHERE  <some condition>
ORDER  BY <some col>
LIMIT  <pagesize>
OFFSET <offset>;

Upozorňujeme, že to může být podstatně dražší než bez celkového počtu . Všechny řádky se musí počítat a případná zkratka, která vezme pouze horní řádky ze shodného indexu, již nemusí být užitečná.
U malých tabulek nebo full_count to příliš nevadí. <=OFFSET + LIMIT . Záleží na podstatně větším full_count .

Rohové pouzdro :když OFFSET je alespoň tak velký jako počet řádků ze základního dotazu, žádný řádek je vráceno. Takže také nezískáte full_count . Možná alternativa:

  • Spusťte dotaz s LIMIT/OFFSET a získejte také celkový počet řádků

Posloupnost událostí v SELECT dotaz

( 0. CTE se vyhodnocují a zhmotňují samostatně. V Postgres 12 nebo novějším může plánovač vkládat podobné dílčí dotazy, než se pustí do práce.) Tady ne.

  1. WHERE klauzule (a JOIN podmínky, i když žádné ve vašem příkladu) filtrují kvalifikující řádky ze základních tabulek. Zbytek je založen na filtrované podmnožině.

( 2. GROUP BY a agregační funkce by šly sem.) Tady ne.

( 3. Jiné SELECT výrazy seznamu jsou vyhodnoceny na základě seskupených / agregovaných sloupců.) Zde ne.

  1. Funkce okna se použijí v závislosti na OVER klauzule a rámcová specifikace funkce. Jednoduché count(*) OVER() je založeno na všech kvalifikačních řádcích.

  2. ORDER BY

( 6. DISTINCT nebo DISTINCT ON by šel sem.) Tady ne.

  1. LIMIT / OFFSET jsou aplikovány na základě stanoveného pořadí pro výběr řádků, které se mají vrátit.

LIMIT / OFFSET se s rostoucím počtem řádků v tabulce stává stále neefektivnější. Pokud potřebujete lepší výkon, zvažte alternativní přístupy:

  • Optimalizujte dotaz pomocí OFFSET na velké tabulce

Alternativy k získání konečného počtu

Existují zcela odlišné přístupy k získání počtu ovlivněných řádků (ne celý počet před OFFSET &LIMIT byly aplikovány). Postgres má interní účetnictví, kolik řádků bylo ovlivněno posledním příkazem SQL. Někteří klienti mohou k těmto informacím přistupovat nebo sami počítat řádky (například psql).

Počet ovlivněných řádků můžete například získat v plpgsql ihned po provedení příkazu SQL pomocí:

GET DIAGNOSTICS integer_var = ROW_COUNT;

Podrobnosti v návodu.

Nebo můžete použít pg_num_rows v PHP . Nebo podobné funkce v jiných klientech.

Související:

  • Vypočítejte počet řádků ovlivněných dávkovým dotazem v PostgreSQL


  1. SQL Jak aktualizovat SUM sloupce přes skupinu ve stejné tabulce

  2. SQL Server přidá primární klíč automatického přírůstku do existující tabulky

  3. MySQL DROP FOREIGN KEY Omezení

  4. Jak zálohovat RAC VM