Так что я пытаюсь создать представление, которое автоматически извлекает данные из последних двенадцати месяцев (начиная с конца прошлого месяца.)Эффективный вид SQL с автоматическим диапазоном дат на основе GetDate
Когда я запускаю это с a где:
WHERE Visit_Date between 'Dec 1 2012' and 'Dec 1 2013'
Он будет работать через ~ 1 мин.
У меня есть некоторые расчеты, которые автоматически создадут эти даты. Но когда я использую их в предложении where, запрос все еще работает через 15 минут.
WHERE Visit_Date between DATEADD(mm,-12,DATEADD(mm,DATEDIFF(mm,12,GETDATE()),0))
and Dateadd(dd,-1,DATEADD(mm,DATEDIFF(mm,12,GETDATE()),0))
Запрос выполняется на столе с 50 миллионами записей. Я уверен, что это более эффективный способ сделать это. Я угадываю, что происходит, это его выполнение через вычисления Getdate() для каждой строки, что, очевидно, не идеально.
Любые предложения? Пожалуйста, имейте в виду, что я создаю представление, и обычно я не пишу хранимые процедуры или динамический SQL.
У вас есть индекс в столбце Visit_Date? –
1) Надеюсь, у вас есть столбец 'DATE' или столбец [SMALL] DATETIME с '00: 00: 00.000 'как время. 2) Это выражение 'Dateadd (dd, -1, DATEADD (mm, DATEDIFF (mm, 12, GETDATE()), 0))' возвращает последний день предыдущего месяца (мне: '2013-11-30 00: 00: 00.000'), а не в первый день текущего месяца (я: ''1 декабря 2013 года') 3) Вы должны опубликовать планы выполнения для обоих запросов. –
Также, если вы используете SQL Server 2012, вы можете создать индекс ColumnStore, он действительно делает некоторые чудеса –