While there is no index skip scan in Postgres yet, emulate it:
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;
With an index on (product_id)
and only 40 unique product IDs in the table this should be Fast. With capital F.
The PK index on (product_id, trade_id)
is good for it, too!
With only very few rows per product_id
(the opposite of your data distribution), DISTINCT
/ DISTINCT ON
would be as fast or faster.
Work to implement index skip scans is ongoing.
See: