Эти два запроса логически эквивалентны?
DECLARE @DateTime DATETIME = GETDATE()
Запрос 1
SELECT *
FROM MyTable
WHERE Datediff(DAY, LogInsertTime, @DateTime) > 7
Запрос 2
SELECT *
FROM MyTable
WHERE LogInsertTime < @DateTime - 7
Если они не являются логически эквивалентными, можете ли вы дать мне логический эквивалент первого запроса, чтобы предложение WHERE могло эффективно использовать индекс (т.е. исключить перенос функций)?
LogInsertTime
есть?Ответы:
Являются ли два запроса, которые вы разместили, логически эквивалентными, не имеет значения; Вы не должны использовать ни один из них. Я постараюсь увести тебя от пары вещей:
LogDateTime
он проиндексирован (или может когда-либо быть).Мне не нравится сокращенная дата математика, и я рекомендую против этого. Конечно, печатать быстрее, но попробуйте это с
DATE
типом данных, и вы получите ужасную ошибку. Гораздо лучше объяснить это, например:источник
Я бы использовал следующий sargeable запрос:
Причина: я считаю, что результат @ DateTime-7 не задокументирован. Даже если он просто эквивалентен DATEADD (DAY, -7, @DateTime), он может сломаться в более позднем выпуске.
источник
- (Subtract): Subtracts two numbers (an arithmetic subtraction operator). Can also subtract a number, in days, from a date.
. Тем не менее, я согласен, что использование явных функций даты делает полученный запрос более читабельным и понятным, чем «магия арифметических операторов».Они не эквивалентны. Записи, которые были 7 дней назад, но до текущего времени суток - будут возвращены только в запросе № 2:
При сравнении дней с использованием
DATEADD
функции , она не принимает часть времени во внимание . Функция вернет 1 при сравнении воскресенья и понедельника независимо от времени.Демо-версия:
Логическим эквивалентом первого запроса, который позволит использовать потенциальные индексы, является либо удаление части времени,
@DateTime
либо установка времени0:00:00
:Причина, по которой первый запрос не может использовать индекс,
LogInsertTime
заключается в том, что столбец скрыт внутри функции. Запрос № 2 сравнивает столбец с постоянным значением, которое позволяет оптимизатору выбирать индексLogInsertTime
.источник