Suponhamos que como resultado de LEFT JOIN
acabo com uma Films
tabela por exemplo:
eu ia | título | começa | termina |
---|---|---|---|
1 | O senhor dos Anéis | 25/04/2024 17:46:00 | 25/04/2024 20:46:00 |
2 | O Matrix | 05/06/2024 11:46:00 | 05/06/2024 13:46:00 |
Onde ambos begins
e ends
são do tipo timestamp without timezone
. Quero obter registros com a seguinte prioridade:
- Filmes em exibição atualmente
- Filmes que serão exibidos a partir de agora até o especificado
endTime
- Filmes exibidos nos últimos 3 dias
Posso fazer algo como:
SELECT * from FILMS WHERE begins >= Now()::timestamp - INTERVAL '3 days' AND ends < endTime::timestamp
ORDER BY
CASE
WHEN endTime::timestamp > Now()::timestamp AND starts < Now()::timestamp THEN 1
WHEN starts < Now()::timestamp THEN 2
ELSE 3
END;
LIMIT lim;
Existe uma maneira de usar índices para tornar isso mais rápido?
E uma vez que você tenha
analyze
sua mesa, isto:Desce até
Execution Time: 1087.371 ms
onde47.981 ms
você pode testar nesta demonstração em 700 mil filmes aleatórios nos últimos 60 dias. Esse é um índice de cobertura que permite varreduras somente de índice .