Sql-Server
如何從 Azure SQL 數據庫的性能角度避免函式?
我最近閱讀了這篇關於與函式有關的性能問題的文章。
我目前處於 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 並且沒有它可能會獲得更好的計劃