Как Dateadd влияет на выполнение SQL-запроса?

Скажите, например, что я присоединяюсь на таблице числа для выполнения некоторой операции между двумя датами в подзапросе, как так:

select n
      ,(select avg(col1)
          from table1
         where timestamp between dateadd(minute, 15*n, @ArbitraryDate) 
                             and dateadd(minute, 15*(n+1), @ArbitraryDate))
  from numbers
 where n < 1200

Запрос работал бы лучше, если бы я, скажем, создал дату из конкатенации varchars, чем использование функции dateadd?

8
задан gbn 23 January 2010 в 14:32
поделиться

6 ответов

Сохранение данных в формате DateTime DataeAdd, скорее всего, будет быстрее

Проверьте этот вопрос: Наиболее эффективный способ на SQL Server, чтобы получить дату даты + время?

Принятый ответ (не я!), Демонстрирует dateAdd over of the rings. Я видел еще один много лет назад, который показал то же самое

5
ответ дан 5 December 2019 в 08:52
поделиться

Будьте осторожны между между ними и датами, взгляните на Как между работой с датами на SQL Server?

Я когда-то заблокировал запрос для запуска с более чем через 24 часа до 36 секунды. Просто не используйте дату функции или преобразования на столбце, см. Здесь: Только в базе данных можно получить 1000% + улучшение, изменив несколько строк кода

, чтобы увидеть, какой запрос выполняет лучше, выполнить обе запросы И посмотрите на планы исполнения, вы также можете использовать статистику IO и время статистики, чтобы получить, сколько чтения и времени, которое потребовалось для выполнения запросов

4
ответ дан 5 December 2019 в 08:52
поделиться

до тех пор, пока ваши расчеты предикатов Не включайте ссылки на столбцы таблицы, которую вы запрашиваете, ваш подход не должен иметь значение в любом случае (пойти на ясность).

Если вы должны были включить что-то из Table1 в расчете, хотя я бы следил за сканированием настои, или скрывает индекс, так как он больше не может быть SARGable .

В любом случае, проверьте (или пост!) План выполнения для подтверждения.

2
ответ дан 5 December 2019 в 08:52
поделиться

Скорее всего, не будет никаких различий так или иначе. Я бы запустил это:

SET STATISTICS IO ON;
SET STATISTICS TIME ON;

, а затем обе варианты вашего запроса, так что вы видите и сравните реальные расходы на исполнение.

3
ответ дан 5 December 2019 в 08:52
поделиться

Я бы не пошел бы с объединением варгача.

DEPEADD будет иметь лучшее выполнение, чем строковое окно, а также отливка на dateTime.

Как всегда, вы лучше всего делают ставку, чтобы профилировать 2 варианта и определить лучший результат, так как нет DB.

3
ответ дан 5 December 2019 в 08:52
поделиться

Почему вы когда-либо использовали коррелированный подзапрос для начала? Это будет замедлить вас гораздо больше, чем dateaDd. Они как курсоры, они работают ряд по ряду. Будет что-то вроде этой работы?

 select n.n , avgcol1   
    from numbers n 
    left outer join  
        (
        select avg(col1) as avgcol1, n
        from table1 
        where timestamp between dateadd(minute, 15*n, @ArbitraryDate)  
           and dateadd(minute, 15*(n+1), @ArbitraryDate)
        Group by n
        ) t
     on n.n = t.n
    where n < 1200 
2
ответ дан 5 December 2019 в 08:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: