Estou tentando otimizar várias consultas que usam um padrão semelhante em uma das WHERE
cláusulas:
AND (DATEADD(DAY
, ISNULL(a.[due_days], 30) + 30
, [dbo].[CalcDate]([type], date1, date2, date3, date4, NULL))
) < GETDATE()
O CalcDate
udf baseado no type
valor do campo faz algumas comparações e retorna uma data. Em seguida, adiciona uma quantidade de dias a essa data e compara com a data atual. Para poder usar um índice existente em due_days
Quero transformar a operação para aplicar todas as transformações a GETDATE()
, digamos que quero fazer isso sargable
, se possível. Além disso, se houver alguma recomendação sobre o que pode ser feito para melhorar ainda mais o uso do udf.
Não é tão difícil fazer essa transformação. Passo a passo:
significa:
então temos que dividir o
ISNULL()
em 2 casos:que pode ser escrita como:
então podemos usar
DATEDIFF()
:e finalmente:
Corrigido, cuidando das partes do tempo:
Você poderia simplificar um pouco, com o uso de
CROSS APPLY
: