Um índice só pode indexar linhas reais, não linhas agregadas. Então, sim, no que diz respeito ao índice desejado, criar uma tabela com valores únicos como você mencionou é sua única opção. Imponha a integridade referencial com uma restrição de chave estrangeira de
data.day
para days.day
. Isso pode também ser o melhor para o desempenho, dependendo da situação completa. No entanto, como se trata de desempenho , existe uma solução alternativa:você pode usar um CTE recursivo para emular uma varredura de índice solto:
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;
Parênteses ao redor do primeiro
SELECT
são necessários devido ao ORDER BY
anexado e LIMIT
cláusulas. Ver:Isso só precisa de um índice simples no
day
. Existem várias variantes, dependendo de suas consultas reais:
- Otimize a consulta GROUP BY para recuperar a última linha por usuário
- Índice não utilizado na consulta de intervalo de datas
- Selecione primeiro linha em cada grupo GROUP BY?
Mais na minha resposta à sua pergunta de acompanhamento: