Pure SQL
Les choses ont changé depuis 2008. Vous pouvez utiliser un fonction de fenêtre pour obtenir le décompte complet y le résultat limité en une seule requête. Introduit avec PostgreSQL 8.4 en 2009 .
SELECT foo
, count(*) OVER() AS full_count
FROM bar
WHERE <some condition>
ORDER BY <some col>
LIMIT <pagesize>
OFFSET <offset>;
Il convient de noter que cette peut être considérablement plus coûteux que sans le décompte total. . Toutes les lignes doivent être comptées, et un éventuel raccourci consistant à ne prendre que les lignes supérieures d'un index correspondant peut ne plus être utile.
Cela n'a pas beaucoup d'importance pour les petites tables ou les tables d'appoint. full_count
<= OFFSET
+ LIMIT
. Des questions pour une plus grande full_count
.
Boîtier d'angle : quand OFFSET
est au moins aussi grand que le nombre de lignes de la requête de base, pas de rangée est renvoyée. Vous n'obtenez donc pas non plus de full_count
. Alternative possible :
Séquence d'événements dans un SELECT
interrogation
( 0. Les CTE sont évalués et matérialisés séparément. Dans Postgres 12 ou une version ultérieure, le planificateur peut intégrer les sous-requêtes avant de se mettre au travail). Pas ici.
-
WHERE
(et JOIN
mais aucune dans votre exemple) filtrent les lignes qualifiées de la (des) table(s) de base. Le reste est basé sur le sous-ensemble filtré.
( 2. GROUP BY
et des fonctions agrégées). Pas ici.
( 3) Autres SELECT
les expressions de liste sont évaluées, sur la base des colonnes groupées / agrégées). Ce n'est pas le cas ici.
-
Les fonctions de la fenêtre sont appliquées en fonction de la OVER
et la spécification du cadre de la fonction. La clause count(*) OVER()
est basé sur toutes les lignes qualifiées.
-
ORDER BY
( 6. DISTINCT
o DISTINCT ON
(voir ici). Pas ici.
-
LIMIT
/ OFFSET
sont appliquées en fonction de l'ordre établi pour sélectionner les lignes à renvoyer.
LIMIT
/ OFFSET
devient de plus en plus inefficace lorsque le nombre de lignes du tableau augmente. Envisagez d'autres approches si vous avez besoin de meilleures performances :
Alternatives pour obtenir le décompte final
Il existe des approches complètement différentes pour obtenir le nombre de lignes affectées ( no le décompte complet avant OFFSET
& LIMIT
ont été appliquées). Postgres comptabilise en interne le nombre de lignes affectées par la dernière commande SQL. Certains clients peuvent accéder à cette information ou compter eux-mêmes les lignes (comme psql).
Par exemple, vous pouvez récupérer le nombre de lignes affectées dans la rubrique plpgsql immédiatement après l'exécution d'une commande SQL avec :
GET DIAGNOSTICS integer_var = ROW_COUNT;
Détails dans le manuel.
Vous pouvez également utiliser pg_num_rows
en PHP . Ou des fonctions similaires chez d'autres clients.
En rapport :