От того, что вы делаете, зависит честность в отношении производительности.
Например, если вы используете DATEDIFF (или даже любую другую функцию) в предложении WHERE, это приведет к снижению производительности, поскольку не позволит использовать индекс для этого столбца.
например. базовый пример, поиск всех записей в 2009
WHERE DATEDIFF(yyyy, DateColumn, '2009-01-01') = 0
не будет использовать индекс DateColumn. Тогда как лучшее решение, обеспечивающее оптимальное использование индекса, будет:
WHERE DateColumn >= '2009-01-01' AND DateColumn < '2010-01-01'
Я недавно опубликовал в блоге информацию о том, какое это имеет значение (со статистикой производительности / сравнениями планов выполнения), если вам интересно.
Это было бы дороже, чем, скажем, возвращать DATEDIFF в качестве столбца в наборе результатов.
Я бы начал с определения отдельных запросов, которые занимают больше всего времени. Проверьте планы выполнения, чтобы увидеть, в чем заключается проблема, и настройтесь оттуда.
Edit:
Основываясь на приведенном вами примере запроса, вот подход, который вы могли бы попробовать исключить использование DATEDIFF в предложении WHERE. Базовый пример, чтобы найти всех, кому было 10 лет на заданную дату - я думаю математика верна, но вы все равно поймете идею! Дали быстрый тест, и, кажется, в порядке. Должно быть достаточно легко адаптироваться к вашему сценарию. Если вы хотите найти людей в возрасте от 15 до 17 лет на определенную дату, это также возможно при таком подходе.
-- Assuming @Date2 is set to the date at which you want to calculate someone's age
DECLARE @AgeAtDate INTEGER
SET @AgeAtDate = 10
DECLARE @BornFrom DATETIME
DECLARE @BornUntil DATETIME
SELECT @BornFrom = DATEADD(yyyy, -(@AgeAtDate + 1), @Date2)
SELECT @BornUntil = DATEADD(yyyy, -@AgeAtDate , @Date2)
SELECT DOB
FROM YourTable
WHERE DOB > @BornFrom AND DOB <= @BornUntil
Важное замечание, которое необходимо добавить: для возрастных расчетов из DOB этот подход более точный Ваша текущая реализация учитывает только год рождения, а не фактический день (например, кто-то, родившийся 1 декабря 2009 года, будет показывать, что ему 1 год, 1 января 2010 года, если ему не 1 год до 1 декабря 2010 года).
Надеюсь, это поможет.