Эффективность SQL - запрос с использованием функции dateAdd дважды; или SubQuery и DateAdd Function один раз; на дату между - PullRequest
6 голосов
/ 02 июня 2011

Расход использует функцию DateAdd не только в SELECT, но и в WHERE; Или используя подзапрос, который первоначально возвращает больше данных, чем мне нужно, но затем может быть отфильтрован без повторного использования функции DateAdd в базе данных.

План выполнения, кажется, подразумевает, что они идентичны, насколько это касается. Мне интересно, что будет более эффективным?

    DECLARE @DateFrom DateTime
    SET @DateFrom = '2011-05-27'
    DECLARE @DateTo DateTime
    SET @DateTo = '2011-06-27'

    SELECT id, name, 
    dateAdd(hour, datediff(hour, getdate(), getutcdate()), --UTC offset
            dateadd(second, itsm_requiredbyx, '1/1/1970 12:00 AM')) as itsm_requiredbyx
    FROM tablename
    WHERE dateAdd(hour, datediff(hour, getdate(), getutcdate()), --UTC offset
            dateadd(second, itsm_requiredbyx, '1/1/1970 12:00 AM'))
            BETWEEN @DateFrom AND @DateTo

    ORDER BY itsm_requiredbyx desc

    ---------------------------------------------------------------------------------------------

    SELECT *
    FROM
        (
        select id, name, 
        dateAdd(hour, datediff(hour, getdate(), getutcdate()), --UTC offset
                dateadd(second, itsm_requiredbyx, '1/1/1970 12:00 AM')) as itsm_requiredbyx
        from tablename 
        ) RR
    WHERE itsm_requiredbyx BETWEEN @DateFrom AND @DateTo
    ORDER BY itsm_requiredbyx desc

Ответы [ 2 ]

7 голосов
/ 02 июня 2011

Я не думаю, что имеет значение, какой из двух вы используете.И планы выполнения согласны.

Но, похоже, вы выполняете вычисления для столбца itsm_requiredbyx, а затем проверяете, находится ли результат между двумя внешними значениями @DateFrom и @DateTo.Таким образом, все даты и времени из этого поля обрабатываются функциями до применения условий WHERE и использования индекса.Вторая ссылка ( Десять распространенных ошибок программирования SQL * ) в ответе @ DOK содержит более подробную информацию о том, почему и когда это происходит.

Если вы этого не сделаетевычисления для столбца, но вместо этого вы выполняете (обращенные) вычисления для внешних значений, а затем проверяете, находится ли itsm_requiredbyx между этими двумя вычисленными значениями, запрос может использовать index из itsm_requiredbyx (ифункции будут вызываться только дважды, а не для каждой строки таблицы).

1 голос
/ 02 июня 2011

Эта статья может помочь вам выбрать.Если ваши столбцы даты проиндексированы, то могут существовать большие различия между используемыми методами, особенно в предложении WHERE .

Как говорится,

Вы ищете большие таблицы с большим количеством записей, вы, скорее всего, будете индексировать некоторые из столбцов даты, которые обычно используются для ограничения запросов.Когда столбец даты используется в предложении WHERE, оптимизатор запросов не будет использовать индекс, если столбец даты обернут в функцию.

Это также объясняется в Десять распространенных ошибках программирования SQL , особенно в разделе # 2 Функции для индексированных столбцов в предикатах:

Проблема возникает из-затот факт, что столбцы индекса передаются в функцию, которую механизм запросов должен затем оценить для каждой строки в таблице.В таких случаях предикат предложения WHERE считается не-SARGable, и лучшее, что может сделать оптимизатор запросов, - выполнить полное сканирование индекса или таблицы.

Чтобы убедиться, что индексы используются, мынеобходимо избегать использования функций на проиндексированных столбцах.

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