Sql-Server

如何從 Azure SQL 數據庫的性能角度避免函式?

  • February 6, 2018

我最近閱讀了這篇關於與函式有關的性能問題的文章。

我目前處於 Azure SQL 數據庫平台上新數據庫的開發階段。它不會在新的幾個月內上線。我正在使用各種標量值函式,其中一個是將UTC轉換為在配置表中指定的本地日期,例如澳大利亞東部標準時間

該函式呼叫如下:

SELECT
   dbo.fnGetLocalDate(DateColumn) as DateColumn,
FROM
   table

有沒有人對如何避免在這種情況下使用功能有任何建議?我發現它們對程式碼重用很有用,我不知道如何在這裡避免它。

我還想知道是否使用 vNext 解決了 Azure 平台中 Functions 的性能問題,我最好繼續使用函式。

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 的內聯以被釋放。

所以你的函式定義是

CREATE FUNCTION [dbo].[fnGetLocalDate] (@DateToConvert DATETIMEOFFSET = NULL) 
RETURNS TABLE 
AS 
   RETURN 
     SELECT CONVERT(DATETIMEOFFSET, @DateToConvert AT TIME ZONE 
                                    (SELECT Value 
                                     FROM   LookUp.Config 
                                     WHERE  Property = 'TimeZone')) AS 
                   LocalDate 

使用範例

SELECT o.name, L.LocalDate
FROM sys.objects o
CROSS APPLY [dbo].[fnGetLocalDate](o.modify_date) AS L

您實際上並不需要 CASE,因為無論如何它都會在 NULL 輸入上返回 NULL 並且沒有它可能會獲得更好的計劃

引用自:https://dba.stackexchange.com/questions/197142