У меня нет доступа к SQL Server с профилировщиком, поэтому я не могу дать столь подробный ответ, как мне хотелось бы.
Вопрос в основном в том, какой из них позволяетвычисление и наиболее эффективное использование индексов.
Варианты, которые используют манипуляции со строками, имеют наибольшую вычислительную нагрузку и вообще не используют индексы.Так что я просто пропущу это.Это оставляет четыре общих выражения ...
SELECT * FROM date_sargable
WHERE YEAR(value) = YEAR (getDate())
AND MONTH(value) = MONTH(getDate())
;
SELECT * FROM date_sargable
WHERE DATEDIFF(MONTH, value, getDate()) = 0
;
SELECT * FROM date_sargable
WHERE DATEDIFF(MONTH, 0, value) = DATEDIFF(MONTH, 0, getDate())
;
SELECT * FROM date_sargable
WHERE value >= DATEADD(MONTH, DATEDIFF(MONTH, 0, getDate()) , 0)
AND value < DATEADD(MONTH, DATEDIFF(MONTH, 0, getDate()) + 1, 0)
;
Первые три используют INDEX SCAN, но последнее использует INDEX SEEK.Разница в том, что формат запроса позволяет оптимизатору узнать, что вам нужен определенный диапазон данных, что все они расположены рядом друг с другом в одном блоке индекса, и что этот блок очень легко найти.
Если, просматривая планы выполнения, вы видите SEEK в одной версии и SCAN в другой, вы с большей вероятностью выиграете от SEEK.