Een index kan alleen werkelijke rijen indexeren, geen geaggregeerde rijen. Dus ja, voor zover de gewenste index gaat, is het maken van een tabel met unieke waarden zoals u noemde uw enige optie. Dwing referentiële integriteit af met een externe sleutelbeperking van data.day
tot days.day
. Dit misschien ook het beste zijn voor prestaties, afhankelijk van de volledige situatie.
Aangezien dit echter gaat over prestaties , is er een alternatieve oplossing:u kunt een recursieve CTE gebruiken om een losse indexscan te emuleren:
WITH RECURSIVE cte AS (
( -- parentheses required
SELECT day FROM data ORDER BY 1 LIMIT 1
)
UNION ALL
SELECT (SELECT day FROM data WHERE day > c.day ORDER BY 1 LIMIT 1)
FROM cte c
WHERE c.day IS NOT NULL -- exit condition
)
SELECT day FROM cte;
Haakjes rond de eerste SELECT
zijn vereist vanwege de bijgevoegde ORDER BY
en LIMIT
clausules. Zie:
Dit heeft alleen een duidelijke index nodig op day
.
Er zijn verschillende varianten, afhankelijk van uw werkelijke vragen:
- Optimaliseer GROUP BY-query om de laatste rij per gebruiker op te halen
- Ongebruikte index in zoekopdracht voor datumbereik
- Selecteer eerst rij in elke GROUP BY-groep?
Meer in mijn antwoord op je vervolgvraag: