O SQL Server pode otimizar o seguinte:
DECLARE @id INT;
DECLARE @d1 DATE;
SELECT a, b
FROM t
WHERE id_column = @id
AND date_column >= CAST(CURRENT_TIMESTAMP AS DATE)
AND date_column >= @d1
Observe que há dois >
operadores na mesma coluna. Supondo que hoje é 2020-12-23
e d1
poderia ser 2020-12-20
ou 2020-12-27
, eu esperava que o SQL Server usasse automaticamente a maior das duas datas ... 2020-12-23
no primeiro caso e 2020-12-27
no último. Mas eu não tenho certeza.
Eu testei em uma tabela no meu banco de dados que tem uma coluna de data.
https://www.brentozar.com/pastetheplan/?id=r1V9bJ-av
Observando o plano de consulta, na edição SQL Server 2019 Dev, o que o SQL fez foi verificar o carimbo de data/hora atual e a data especificada e criar um intervalo de datas. Em seguida, ele escaneou minha tabela para encontrar as linhas nesse intervalo (nenhuma).
No começo eu pensei que estava procurando por um intervalo entre as duas datas.
mas ao olhar para as leituras lógicas, acho que o que ele fez foi pesquisar entre "CAST(CURRENT_TIMESTAMP AS DATE)" e "NOW", que é algumas horas. Então, acho que o SQL fez exatamente o que você espera, que é otimizar a operação ">" na mesma coluna.
Scan count 1, logical reads 4, physical reads 0, page server reads 0, read-ahead reads 0, page server read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob page server reads 0, lob read-ahead reads 0, lob page server read-ahead reads 0.
Além disso, se eu alterar a consulta para fazer um "OR" em vez de um "AND", recebo 84 leituras lógicas em vez de 4 e muito mais linhas retornadas na busca do índice. O que me indica que o SQL Server 2019 é inteligente o suficiente para otimizar a consulta com dois ">" na mesma coluna.
https://www.brentozar.com/pastetheplan/?id=BkbGf1Wpw
Agora, isso pode não se aplicar o tempo todo, dependendo da complexidade de sua consulta ou se você tiver muito mais condições em sua cláusula where. Testá-lo em seu ambiente é a chave.
Como ambas as condições devem ser satisfeitas, o resultado será baseado na data maior. No entanto, em vez de criar 2 condições, você pode alterar a consulta para obter a data maior de duas: