Chociaż w Postgresie nie ma jeszcze skanowania z pomijaniem indeksu, emuluj go:
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;
Z indeksem na (product_id) i tylko 40 unikalnych identyfikatorów produktów w tabeli to powinno być szybko . Przez duże F .
Indeks PK w (product_id, trade_id) to też jest dobre!
Z bardzo małą liczbą wierszy na product_id (przeciwieństwo dystrybucji danych), DISTINCT / DISTINCT ON byłby tak szybki lub szybszy.
Trwają prace nad wdrożeniem skanowania z pomijaniem indeksu.
Patrz:
- Wybrać pierwszy wiersz w każdej grupie GROUP BY?
- Zoptymalizuj zapytanie GROUP BY, aby pobrać ostatni wiersz na użytkownika
- Czy indeks złożony jest również odpowiedni dla zapytań w pierwszym polu?