Maison >développement back-end >tutoriel php >Comment obtenir efficacement le nombre total de lignes avant d'appliquer LIMIT dans PostgreSQL ?

Comment obtenir efficacement le nombre total de lignes avant d'appliquer LIMIT dans PostgreSQL ?

Patricia Arquette
Patricia Arquetteoriginal
2024-12-19 02:22:11419parcourir

How to Efficiently Get Total Row Count Before Applying LIMIT in PostgreSQL?

Meilleur moyen de déterminer le nombre de résultats avant l'application LIMIT

Dans les requêtes de base de données, la détermination du nombre total de résultats avant d'appliquer LIMIT est cruciale pour la pagination. Actuellement, une approche courante consiste à exécuter la requête deux fois : une fois pour compter tous les résultats et une autre fois avec une limite pour récupérer la page souhaitée. Cependant, cette méthode peut s'avérer inefficace.

Heureusement, PostgreSQL 8.4 a introduit une solution plus efficace : les fonctions de fenêtre. En utilisant une fonction de fenêtre, vous pouvez récupérer à la fois le nombre total de résultats et les résultats limités en une seule requête.

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

Notez que même si cette méthode fournit les informations souhaitées, elle peut être coûteuse en calcul, car tout les lignes doivent être traitées même si elles seront exclues par le LIMIT.

Séquence des événements dans une requête SELECT

Comprendre la séquence d'événements dans une requête SELECT peut aider à comprendre comment fonctionnent les fonctions des fenêtres. L'ordre des opérations dans Postgres est le suivant :

  1. Filtrer les lignes en fonction de la clause WHERE
  2. Appliquer les fonctions de fenêtre
  3. Order les résultats en fonction de ORDER BY
  4. Résultats limites basés sur LIMIT et OFFSET

Méthodes alternatives de comptage Récupération

En plus des fonctions de fenêtre, il existe des méthodes alternatives pour récupérer le nombre de lignes concernées :

  • plpgsql : GET DIAGNOSTICS integer_var = ROW_COUNT;
  • PHP : pg_num_rows

Ces méthodes fournissent le nombre de lignes affectées par la requête plutôt que le nombre complet avant l'application LIMIT.

Ressources associées :

  • [Optimiser requête avec OFFSET sur grand table](https://dba.stackexchange.com/questions/128089/optimize-query-with-offset-on-large-table)
  • [Calculer le nombre de lignes affectées par la requête par lots dans PostgreSQL](https://stackoverflow.com/questions/4644316/calculate-number-of-rows-affected-by-batch-query-in-postgresql)

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn