Другой запрос SQL для сравнения даты - PullRequest
0 голосов
/ 14 июля 2020

Я пытаюсь получить записи из таблицы электронной почты, которая меньше 14 дней. Просто хотите знать, есть ли разница в производительности в следующих двух запросах?

  select * 
  from email e
  where  DATEDIFF(day, e.recevied_date, cast(GETDATE() as date)) < 14

  select * 
  from email e
  where (GETDATE() - e.recevied_date) < 14

Ответы [ 2 ]

2 голосов
/ 14 июля 2020

A sargable способ записи этого предиката - ie, поэтому SQL Сервер может использовать индекс в столбце e.received_date, это будет:

where e.received_date > dateadd(day, -14, getdate())

С в этой конструкции нет выражения, которое необходимо вычислить для данных в столбце полученная_дата, а правая часть вычисляет постоянное выражение.

Если вы поместите столбец в выражение, например datediff(day, e.received_date, getdate()), тогда SQL сервер должен оценить каждую строку в таблице, прежде чем сможет определить, меньше ли она 14. Это исключает использование индекса.

Таким образом, практически не должно быть значительной разницы между две конструкции, которые у вас есть в настоящее время, в том смысле, что обе будут намного медленнее, чем предикат sargable, особенно если есть индекс в столбце received_date.

0 голосов
/ 14 июля 2020

Два выражения не эквивалентны.

Первое подсчитывает количество полуноч между двумя датами, поэтому возвращаются полные дни.

Второе включает время.

Если вы хотите, чтобы завершилось дней с такого количества дней a go, лучший способ:

where e.received_date >= convert(date, dateadd(day, -14, getdate()))

>= - включить полночь.

Это лучше, потому что единственные операции выполняются на getdate() - и они фактически могут быть обработаны до основной фазы выполнения. Это позволяет запросу использовать индексы, разделы и статистику для e.received_date.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...