Selvom der ikke er nogen indeksspringsscanning i Postgres endnu, emuler det:
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;
Med et indeks på (product_id) og kun 40 unikke produkt-id'er i tabellen dette skal være hurtigt . Med stort F .
PK-indekset på (product_id, trade_id) er også god til det!
Med kun meget få rækker pr. product_id (det modsatte af din datadistribution), DISTINCT / DISTINCT ON ville være lige så hurtig eller hurtigere.
Arbejdet med at implementere indeksspringsscanninger er i gang.
Se:
- Vælg første række i hver GROUP BY-gruppe?
- Optimer GROUP BY-forespørgsel for at hente seneste række pr. bruger
- Er et sammensat indeks også godt til forespørgsler i det første felt?