Č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.
WHERE
klauzule (aJOIN
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.
-
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. -
ORDER BY
( 6. DISTINCT
nebo DISTINCT ON
by šel sem.) Tady ne.
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