Eu tenho isto:
SELECT
A
,B
,dbo.Func(C)
,dbo.Func(D)
,dbo.Func(E)
,F
FROM abcdef
WHERE
0 = dbo.Func(C) + dbo.Func(D)
Eu li que isso não é uma boa prática porque a função é chamada milhões de vezes e tem um impacto ruim no desempenho.
Tentei reescrever com CROSS APPLY:
SELECT *
FROM abcdef
CROSS APPLY dbo.Func(D) as FD
mas retorna esse erro:
Invalid object name 'dbo.Func'
Posso usar CROSS APPLY apenas em funções TABLE VALUED?
E o CROSS APPLY é adequado para funções escalares (convertidas em função com valor de tabela)? Porque no meu pequeno teste de desempenho, o CROSS APPLY é um pouco mais lento.
Embora
CROSS APPLY
possa ser útil em alguns casos, não espero nenhuma diferença no desempenho entre chamar a funçãoWHERE
ouCROSS APPLY
no caso específico. Se a tabela tiver um milhão de linhas (e colunasC
eD
possivelmente um milhão de valores diferentes), um milhão de vezes a função será chamada. Como pode ser diferente?Veja como:
ou:
Novamente, não acho que isso tenha qualquer efeito sobre a eficiência.
UDFs escalares podem fazer com que sua consulta seja executada em um único thread.
Veja o post de Ozar sobre o assunto.