何时在SQL Server数据仓库中使用用户定义的函数

时间:2019-01-21 00:55:27

标签: sql sql-server ssis etl data-warehouse

我正在创建一个DWH,在其中将数据加载到暂存DB中,然后再将它们加载到最终DB中,然后应用在数据上创建的所有udf。

  • 源数据库:Oracle
  • 目标数据库:SQL Server
  • ETL流程:SSIS包

我没有在登台过程中进行任何处理以快速加载。

问题:当数据处于暂存状态时,应用所有的udfs是否更快,还是在将数据加载到最终DB中时完成?

facility_cd下面是一个float值,我将其传递给函数emr_get_code_Description以获取相应的描述。从中获取描述的表位于最终数据库中。 udf_replace_special_char是一个简单的函数,它将一些特殊字符替换为NULL。

LTRIM(RTRIM([Dest_DWH].[dbo].udf_replace_special_char([Dest_DWH].[dbo].[emr_get_code_Description](Stg_ap.Facility_cd))))

一般来说,什么是更好的做法?我应该在登台中更新此内容,然后在所有转换后将数据加载到Final DB中吗。

函数定义:

功能1:

USE [PROD_DWH]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER function [dbo].[emr_get_code_Description](@cv int)  
returns varchar(80)  
as begin   

-- Returns the code value display 
    declare @ret varchar(80)  
    select @ret = cv.DESCRIPTION
        from PROD_DWH.DBO.table cv   
        where cv.code_value = @cv   
            and cv.active_ind = 1  

    return isnull(@ret, 0)

end;

功能2:

USE [PROD_DWH]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER function [dbo].[udf_replace_special_char](@var varchar(1000))  
returns varchar(1000)  
as begin   
-- Returns the code value display 
    declare @return_var varchar(1000)  
    set @return_var = @var
    set @return_var = replace(@return_var,CHAR(13),'')
    set @return_var = replace(@return_var,CHAR(10),'')
    set @return_var = replace(@return_var,CHAR(09),'')
    set @return_var = replace(@return_var,CHAR(34),CHAR(39))

    return isnull(@return_var, 0)

end;

1 个答案:

答案 0 :(得分:2)

首先,如注释中提到的@ Nick.McDermaid:最佳实践是避免使用用户定义的函数。有很多链接包含有关函数对查询性能的影响的信息。


对于这些问题,没有一个理想的答案,这与您正在处理的情况有关,但是我可以提供一些可以考虑的技巧:

  • 首先,如果要使用SSIS将数据导入到暂存表中,请尝试使用SSIS数据流组件(例如派生列转换,查找)替换用户定义的函数,以增强数据导入的性能。 / li>
  • 如果不能用SSIS组件替换UDF:如果正在将数据高速收集到数据湖(登台级别),然后在需要时加载数据,则最好避免在将数据导入到登台表时使用函数。
  • 如果从临时表加载数据时需要保证高速,请在第一个数据导入阶段使用该功能。
  • 如果第一数据导入阶段(到登台表)和第二阶段(从登台表)不在同一台计算机上执行,则最好在性能更高的计算机上执行功能。
  • 如果函数包含某些操作(例如查找),请尝试将它们替换为联接。

...

更新1

在问题中发布函数后,可以在SSIS包中用派生列转换替换函数2:

ISNULL([Column]) ? "" : REPLACE(REPLACE(REPLACE(REPLACE([Column],CHAR(10),""),CHAR(13),""),CHAR(09),""),CHAR(34),CHAR(39))

还可以用SSIS包中的“查找转换”或SQL查询中的“左联接”替换功能1。