Eu li este artigo recentemente sobre os problemas de desempenho relacionados ao Functions.
Atualmente estou na fase de desenvolvimento de um novo banco de dados na plataforma Azure SQL Database. Ainda não será lançado por um novo mês. Estou usando uma variedade de funções de valor escalar, sendo uma delas converter UTC em data local, onde é especificado na tabela de configuração, por exemplo, AUS Eastern Standard Time
A função é chamada da seguinte forma:
SELECT
dbo.fnGetLocalDate(DateColumn) as DateColumn,
FROM
table
Alguém tem alguma sugestão sobre como evitar funções em casos como este? Acho-os úteis para reutilização de código e não sei como evitá-lo aqui.
Também estou me perguntando se com o vNext corrigindo os problemas de desempenho com o Functions na plataforma do Azure é melhor continuar trabalhando com funções.
CREATE FUNCTION [dbo].[fnGetLocalDate]
(
@DateToConvert datetimeoffset = NULL
)
RETURNS datetimeoffset
AS
BEGIN
DECLARE @TimeZone varchar(50)
RETURN
CASE
WHEN @DateToConvert is NULL then NULL
ELSE
CONVERT(datetimeoffset, @DateToConvert AT TIME ZONE (SELECT Value FROM LookUp.Config WHERE Property = 'TimeZone'))
END
END
Você pode reescrevê-lo como um TVF inline retornando uma única coluna e linha e CROSS APPLY para obter os benefícios do inlining agora (paralelismo, sem sobrecarga de alternar contextos de execução, custo e otimização de consulta holística) sem ter que esperar pelo trabalho feito em inlining de UDFs escalares para serem liberados.
Então sua definição de função seria
Com exemplo de uso
Você realmente não precisa do CASE, pois ele retornará NULL na entrada NULL de qualquer maneira e pode obter planos melhores sem ele
C# oferece a classe System.TimeZoneInfo. Esta classe expõe 2 métodos úteis. O primeiro método útil é chamado FindSystemTimeZoneById(). Ao passar o ID do fuso horário para o método, você pode obter o TimeZoneInfo para o ID fornecido. Por exemplo, se o seu site do Azure estiver hospedado na Europa Ocidental e você quiser o horário para Munique, Alemanha, poderá usar o seguinte conjunto de códigos mostrado abaixo.
Parece que a Microsoft está recomendando o uso de uma função do SQL Server neste artigo.
Essas duas são as duas opções que eu sei que você pode usar.