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 ?