我正在创建一个DWH,在其中将数据加载到暂存DB中,然后再将它们加载到最终DB中,然后应用在数据上创建的所有udf。
我没有在登台过程中进行任何处理以快速加载。
问题:当数据处于暂存状态时,应用所有的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;
答案 0 :(得分:2)
首先,如注释中提到的@ Nick.McDermaid:最佳实践是避免使用用户定义的函数。有很多链接包含有关函数对查询性能的影响的信息。
对于这些问题,没有一个理想的答案,这与您正在处理的情况有关,但是我可以提供一些可以考虑的技巧:
...
在问题中发布函数后,可以在SSIS包中用派生列转换替换函数2:
ISNULL([Column]) ? "" : REPLACE(REPLACE(REPLACE(REPLACE([Column],CHAR(10),""),CHAR(13),""),CHAR(09),""),CHAR(34),CHAR(39))
还可以用SSIS包中的“查找转换”或SQL查询中的“左联接”替换功能1。