Maison >base de données >tutoriel mysql >Pourquoi SELECT DISTINCT est-il lent sur une table avec une clé primaire composite dans PostgreSQL et comment peut-il être optimisé ?

Pourquoi SELECT DISTINCT est-il lent sur une table avec une clé primaire composite dans PostgreSQL et comment peut-il être optimisé ?

Patricia Arquette
Patricia Arquetteoriginal
2025-01-07 18:27:40764parcourir

Sur les tables utilisant des clés primaires composites dans PostgreSQL SELECT DISTINCT Raisons de la lenteur des requêtes et des méthodes d'optimisation

Why is SELECT DISTINCT Slow on a Table with a Composite Primary Key in PostgreSQL, and How Can It Be Optimized?

Dans une base de données PostgreSQL, SELECT DISTINCT la vitesse d'exécution d'une requête dépend de la structure de la table et de la distribution des données. Bien que la colonne tickers de la table product_id fasse partie d'une clé primaire composite et soit donc indexée sur celle-ci, une requête qui utilise SELECT DISTINCT product_id FROM tickers pour obtenir un product_id unique effectue une analyse séquentielle par défaut.

Raisons de la lenteur des performances

La principale raison de la lenteur des performances de

est qu'il existe des valeurs en double de product_id dans le tableau. Cela signifie que pour chaque product_id unique récupéré, PostgreSQL doit analyser la table entière pour s'assurer qu'il n'y a pas de doublons.

Solution : simuler l'analyse des sauts d'index

Étant donné que PostgreSQL ne prend pas encore en charge nativement les analyses de saut d'index, vous pouvez utiliser des CTE (expressions de table communes) récursives pour simuler ce comportement. Ce CTE récupère et supprime les doublons de manière itérative, filtrant efficacement toutes les instances sauf une de chaque product_id unique.

Solution améliorée

<code class="language-sql">WITH RECURSIVE cte AS (
   (   -- 括号必需
   SELECT product_id
   FROM   tickers
   ORDER  BY 1
   LIMIT  1
   )
   UNION ALL
   SELECT l.*
   FROM   cte c
   CROSS  JOIN LATERAL (
      SELECT product_id
      FROM   tickers t
      WHERE  t.product_id > c.product_id  -- 横向引用
      ORDER  BY 1
      LIMIT  1
      ) l
   )
TABLE  cte;</code>

Cette requête utilise une jointure horizontale pour parcourir la table triée et récupérer des valeurs orderBy uniques à l'aide de product_id .

Conclusion

Le temps d'exécution des requêtes SELECT DISTINCT product_id peut être considérablement amélioré en simulant une analyse de saut d'index à l'aide de la méthode CTE, réduisant ainsi le temps nécessaire pour récupérer les tickers uniques de la table product_id.

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