У меня есть такой запрос:
SELECT col1
FROM MyTable
WHERE
DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))
BETWEEN col2
AND col3
;
Это дает всплывающую подсказку о плане выполнения, подобную этой:
Выполняется ли dateadd
часть предикатов поиска для каждой строки в запросе? Или SQL Server вычисляет значение один раз для всего запроса?
источник
GETDATE()
.Планы выполнения хороши, но иногда они просто не говорят вам правду. Итак, вот доказательство, основанное на тесте производительности.
(и нижняя строка - выражение не оценивается для каждой строки)
Это запрос OP, выполнение которого занимает около 12 секунд.
Этот запрос, который сохраняет дату в параметре перед выполнением, занимает примерно 12 секунд.
И просто для проверки результатов -
этот запрос, который выполняет вычисления на col1 и, следовательно, должен пересчитать выражение для каждой строки, занимает около 30 секунд для выполнения.
Все запросы выполнялись неоднократно, показывая примерно одинаковые показатели
источник