Obwohl es in Postgres noch keinen Index-Skip-Scan gibt, emulieren Sie ihn:
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;
Mit einem Index auf (product_id)
und nur 40 eindeutige Produkt-IDs in der Tabelle das sollte Schnell sein . Mit großem F .
Der PK-Index auf (product_id, trade_id)
ist auch gut dafür!
Mit nur sehr wenigen Zeilen pro product_id
(das Gegenteil Ihrer Datenverteilung), DISTINCT
/ DISTINCT ON
wäre genauso schnell oder schneller.
Die Arbeit an der Implementierung von Index-Skip-Scans ist im Gange.
Siehe:
- Erste Zeile in jeder GROUP BY-Gruppe auswählen?
- Optimieren Sie die GROUP BY-Abfrage, um die neueste Zeile pro Benutzer abzurufen
- Ist ein zusammengesetzter Index auch gut für Abfragen im ersten Feld?