Недавно я понял, что при вызове 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