Č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.
WHEREklauzule (aJOINpodmí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.
-
Funkce okna se použijí v závislosti na
OVERklauzule a rámcová specifikace funkce. Jednoduchécount(*) OVER()je založeno na všech kvalifikačních řádcích. -
ORDER BY
( 6. DISTINCT nebo DISTINCT ON by šel sem.) Tady ne.
LIMIT/OFFSETjsou 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