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?