PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

SELECT DISTINCT est plus lent que prévu sur ma table dans PostgreSQL

Bien qu'il n'y ait pas encore d'index skip scan dans Postgres, émulez-le :

WITH RECURSIVE cte AS (
   (   -- parentheses required
   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  -- lateral reference
      ORDER  BY 1
      LIMIT  1
      ) l
   )
TABLE  cte;

Avec un index sur (product_id) et seulement 40 ID de produit uniques dans le tableau cela devrait être Rapide . Avec F majuscule .
L'indice PK sur (product_id, trade_id) c'est bon aussi !

Avec seulement très peu de lignes par product_id (le contraire de votre distribution de données), DISTINCT / DISTINCT ON serait aussi rapide ou plus rapide.

Le travail de mise en œuvre des analyses de saut d'index est en cours.
Voir :

  • Sélectionner la première ligne de chaque groupe GROUP BY ?
  • Optimiser la requête GROUP BY pour récupérer la dernière ligne par utilisateur
  • Un index composite est-il également adapté aux requêtes sur le premier champ ?