Почему производительность запросов повышается за счет вызова UDF с использованием подзапроса? - PullRequest
0 голосов
/ 07 июня 2018

Недавно я понял, что при вызове UDF в подзапросе намного лучше, чем при их непосредственном вызове, почему это происходит?

Например:

CREATE FUNCTION [CurrentYearStart]()
RETURNS DATETIME
AS
BEGIN
    DECLARE @Date DATETIME;
    SELECT top 1 @Date = StartPeriod
    FROM SystemPeriods WITH (NOLOCK);
    RETURN @Date;
END

ProviderServiceAreas имеют 412585 строк.

Следующий запрос возвращается примерно через 50 с

SELECT   PayGroup, SystemType, MAX(EffDt) AS MaxEffDt
FROM     CAT.ProviderServiceAreas
WHERE    EffDt > CurrentYearStart() 
GROUP BY Paygroup, SystemType 

План выполнения: https://www.brentozar.com/pastetheplan/?id=BJCom7vgm

Следующий запрос возвращается примерно через 1 с

SELECT   PayGroup, SystemType, MAX(EffDt) AS MaxEffDt
FROM     CAT.ProviderServiceAreas
WHERE    EffDt > (SELECT CurrentYearStart()) 
GROUP BY Paygroup, SystemType 

Выполнениеплан: https://www.brentozar.com/pastetheplan/?id=HkolVQDx7

1 Ответ

0 голосов
/ 07 июня 2018

Я бы выбрал:

SELECT PayGroup, SystemType, MAX(EffDt) AS MaxEffDt
FROM ServiceAreas CROSS JOIN
     (SELECT StartPeriod() as sp) sp
WHERE EffDt > sp.sp
GROUP BY Paygroup, SystemType ;

Очевидно, что разница в производительности - это количество вызовов функции.У вас есть больше возможностей, если вы поместите вызов функции в предложение FROM.

...