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é ?
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
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!