Et indeks kan kun indeksere faktiske rækker, ikke aggregerede rækker. Så ja, hvad angår det ønskede indeks, er det din eneste mulighed at oprette en tabel med unikke værdier, som du nævnte. Håndhæv referenceintegritet med en fremmednøglebegrænsning fra data.day
til days.day
. Dette måske også være bedst til ydeevne, afhængigt af den komplette situation.
Men da dette handler om ydelse , er der en alternativ løsning:du kan bruge en rekursiv CTE til at efterligne en løs indeksscanning:
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;
Parentes omkring den første SELECT
er påkrævet på grund af den vedhæftede ORDER BY
og LIMIT
klausuler. Se:
Dette kræver kun et almindeligt indeks på day
.
Der er forskellige varianter, afhængigt af dine faktiske forespørgsler:
- Optimer GROUP BY-forespørgsel for at hente seneste række pr. bruger
- Ubrugt indeks inden for datointerval forespørgsel
- Vælg først række i hver GRUPPE FOR gruppe?
Mere i mit svar på dit opfølgende spørgsmål: