Скажите, например, что я присоединяюсь на таблице числа для выполнения некоторой операции между двумя датами в подзапросе, как так:
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?
Сохранение данных в формате DateTime DataeAdd, скорее всего, будет быстрее
Проверьте этот вопрос: Наиболее эффективный способ на SQL Server, чтобы получить дату даты + время?
Принятый ответ (не я!), Демонстрирует dateAdd over of the rings. Я видел еще один много лет назад, который показал то же самое
Будьте осторожны между между ними и датами, взгляните на Как между работой с датами на SQL Server?
Я когда-то заблокировал запрос для запуска с более чем через 24 часа до 36 секунды. Просто не используйте дату функции или преобразования на столбце, см. Здесь: Только в базе данных можно получить 1000% + улучшение, изменив несколько строк кода
, чтобы увидеть, какой запрос выполняет лучше, выполнить обе запросы И посмотрите на планы исполнения, вы также можете использовать статистику IO и время статистики, чтобы получить, сколько чтения и времени, которое потребовалось для выполнения запросов
до тех пор, пока ваши расчеты предикатов Не включайте ссылки на столбцы таблицы, которую вы запрашиваете, ваш подход не должен иметь значение в любом случае (пойти на ясность).
Если вы должны были включить что-то из Table1
в расчете, хотя я бы следил за сканированием настои, или скрывает индекс, так как он больше не может быть SARGable .
В любом случае, проверьте (или пост!) План выполнения для подтверждения.
Скорее всего, не будет никаких различий так или иначе. Я бы запустил это:
SET STATISTICS IO ON;
SET STATISTICS TIME ON;
, а затем обе варианты вашего запроса, так что вы видите и сравните реальные расходы на исполнение.
Я бы не пошел бы с объединением варгача.
DEPEADD будет иметь лучшее выполнение, чем строковое окно, а также отливка на dateTime.
Как всегда, вы лучше всего делают ставку, чтобы профилировать 2 варианта и определить лучший результат, так как нет DB.
Почему вы когда-либо использовали коррелированный подзапрос для начала? Это будет замедлить вас гораздо больше, чем 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