Essas duas consultas são logicamente equivalentes?
DECLARE @DateTime DATETIME = GETDATE()
Consulta 1
SELECT *
FROM MyTable
WHERE Datediff(DAY, LogInsertTime, @DateTime) > 7
Consulta 2
SELECT *
FROM MyTable
WHERE LogInsertTime < @DateTime - 7
Se eles não forem logicamente equivalentes, você pode me fornecer o equivalente lógico da primeira consulta para que a cláusula WHERE possa efetivamente usar um índice (ou seja, eliminar o agrupamento de função)?
Se as duas consultas que você postou são logicamente equivalentes é irrelevante; você não deve usar nenhum deles. Vou tentar afastá-lo de algumas coisas:
LogDateTime
for indexada (ou poderá ser).Não gosto da matemática da data abreviada e não a recomendo. Claro, é mais rápido digitar, mas tente isso com um
DATE
tipo de dados e você obterá um erro feio. Muito melhor soletrar, por exemplo:Eu usaria a seguinte consulta sargeable:
O motivo: acredito que o resultado de @DateTime-7 não esteja documentado. Mesmo que seja equivalente a DATEADD(DAY, -7, @DateTime), pode ser interrompido em uma versão posterior.
Eles não são equivalentes. Registros de 7 dias atrás, mas antes da hora atual do dia - serão retornados apenas na consulta nº 2:
Ao comparar os dias usando a
DATEADD
função , ela não leva em consideração a parte do tempo . A função retornará 1 ao comparar domingo e segunda-feira, independentemente dos horários.Demonstração:
O equivalente lógico da primeira consulta que permitirá o uso potencial do índice é remover a parte do tempo
@DateTime
ou definir o tempo para0:00:00
:A razão pela qual a primeira consulta não pode usar um índice
LogInsertTime
é porque a coluna está oculta em uma função. A consulta nº 2 compara a coluna com um valor constante que permite ao otimizador escolher um índice emLogInsertTime
.