При чтении при настройке TSQL
запросов я видел совет по предотвращению (или осторожности) функций в предложении WHERE
. Однако, в некоторых случаях - например, поисковые запросы, требующие динамических дат с сегодняшней даты, - мне любопытно, можно ли еще настроить запрос? Например, запрос ниже этого использует функцию DATEADD
для текущей даты, которая позволяет пользователю в любое время, чтобы получить правильную информацию в течение последних тридцати дней:TSQL: Tune Dynamic Query Search
SELECT *
FROM Zoo..Transportation
WHERE ArrivalDate BETWEEN DATEADD(DD,-30,GETDATE()) AND GETDATE()
Если я пытаюсь устранить функцию, DATEADD
, Я мог бы объявить переменную, которая будет тянуть это время, а затем запрашивать данные с этого заданного значения, хранящегося в переменной, например:
DECLARE @begin DATE
SET @begin = DATEADD(DD,-30,GETDATE())
SELECT *
FROM Zoo..Transportation
WHERE ArrivalDate BETWEEN @begin AND GETDATE()
Однако план и статистика выполнения показывает точное такое же количество прочтений, сканирование и стоимость партии.
В этих случаях динамические данные (например, с использованием сегодняшней даты в качестве отправной точки), как мы можем уменьшить или исключить использование функций в предложении WHERE
?
Что происходит с планом выполнения при изменении второго запроса, чтобы он не использовал GETDATE() в предложении BETWEEN? Вместо этого попробуйте переменную для этого. –
@ Майкл, что не имеет значения. SQL Server достаточно умен, чтобы рассматривать это как константу. –
@MichaelHarmon - я тестировал это, и он генерирует тот же результат, что и Аарон. – Question3CPO