Även om det inte finns någon indexöverhoppningsskanning i Postgres ännu, emulera den:
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 ett index på (product_id)
och endast 40 unika produkt-ID:n i tabellen det här ska vara snabbt . Med stort F .
PK-indexet på (product_id, trade_id)
är bra för det också!
Med endast väldigt få rader per product_id
(motsatsen till din datadistribution), DISTINCT
/ DISTINCT ON
skulle vara lika snabb eller snabbare.
Arbetet med att implementera indexhoppningsskanningar pågår.
Se:
- Välj första raden i varje GROUP BY-grupp?
- Optimera GROUP BY-frågan för att hämta den senaste raden per användare
- Är ett sammansatt index också bra för frågor i det första fältet?