Кажется, вы неверно истолковали «Стоимость запроса (относительно пакета)» для «Стоимость запроса (сколько времени потребуется для выполнения запроса)» в плане выполнения.Стоимость запроса может очень мало зависеть от того, насколько он эффективен или быстр.
Я выполнил этот запрос (изменив даты), выполнив следующие действия:
SET STATISTICS IO ON;
SET STATISTICS TIME ON;
Для запроса, который вы пометили как «медленный» (без UDF), результат был:
The "slow" one
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
SQL Server parse and compile time:
CPU time = 8 ms, elapsed time = 8 ms.
(19305 rows affected)
Table 'sysschobjs'. Scan count 1, logical reads 379, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
(1 row affected)
SQL Server Execution Times:
CPU time = 62 ms, elapsed time = 61 ms.
А для запроса, который вы пометили «быстрый» (UDF), было получено:
The "fast" one
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 7 ms.
(19305 rows affected)
Table 'sysschobjs'. Scan count 0, logical reads 38610, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table '#B1BBD6DD'. Scan count 1, logical reads 34, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
(1 row affected)
SQL Server Execution Times:
CPU time = 266 ms, elapsed time = 329 ms.
Как видно из этой статистики, версия без UDF была безусловно победителем.Время выполнения для не-UDF было более чем в 5 раз быстрее, однако ввод-вывод для запроса UDF был безумным (более чем в 1000 раз больше операций чтения).
При всей честности, многострочные функции табличных значенийболее чем часто убийцы производительности.Из трех типов функций (встроенное табличное значение, скалярное значение и многострочное табличное значение) они, вероятно, являются самыми медленными, тогда как встроенные намного чаще бывают быстрее.На слуху, я слышал, что скалярные функции «лучше» в SQL Server 2019, однако я не проверял себя и не видел никаких реальных доказательств;только в разговоре.