我最近读了这篇关于与函数有关的性能问题的文章。
我目前正处于 Azure SQL 数据库平台上新数据库的开发阶段。它不会在新的几个月内上线。我正在使用各种标量值函数,其中一个是将 UTC 转换为在配置表中指定的本地日期,例如澳大利亚东部标准时间
该函数被调用如下:
SELECT
dbo.fnGetLocalDate(DateColumn) as DateColumn,
FROM
table
在这种情况下,有没有人对如何避免功能有任何建议?我发现它们对代码重用很有用,我不确定如何在这里避免它。
我还想知道 vNext 是否解决了 Azure 平台中函数的性能问题,我最好还是继续使用函数。
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
您可以将其重写为返回单个列和行的内联 TVF,然后交叉应用它以获得内联的好处(并行性、无切换执行上下文的开销、整体查询成本计算和优化),而无需等待完成的工作内联标量 UDF以获得发布。
所以你的函数定义是
使用示例
你真的不需要 CASE 因为它无论如何都会在 NULL 输入上返回 NULL 并且没有它可能会得到更好的计划
C# 提供了 System.TimeZoneInfo 类。此类公开了 2 个有用的方法。第一个有用的方法名为 FindSystemTimeZoneById()。通过将时区 ID 传递给方法,您可以获得给定 ID 的 TimeZoneInfo。例如,如果你的 Azure 网站托管在西欧,而你想要德国慕尼黑的时间,那么你可以使用如下所示的代码集。
Microsoft 似乎建议在本文中使用 SQL Server函数。
这两个是我知道你可以使用的两个选项。