Когда использовать пользовательские функции в хранилище данных SQL Server - PullRequest
0 голосов
/ 21 января 2019

Я работаю над созданием DWH, в который я загружаю данные в промежуточную БД, и перед загрузкой их в конечную БД я применяю все udf, которые я создал для данных.

  • Исходная БД: Oracle
  • Dest DB: SQL Server
  • ETL Процесс: пакеты служб SSIS

Я не обрабатывал что-либо при подготовке для быстрой загрузки.

Вопрос: быстрее ли применять какие-либо файлы udf, когда данные находятся в стадии подготовки, или это следует делать при загрузке данных в конечную базу данных.

Ниже 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))))

В целом, что должно быть лучше?Должен ли я обновлять это при подготовке, а затем загружать данные после всех преобразований в конечную базу данных.

Определения функций:

Функция 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 голосов
/ 22 января 2019

Прежде всего, как упомянул в комментариях @ Nick.McDermaid: Лучше всего избегать использования пользовательских функций.Существует множество ссылок, содержащих информацию о влиянии функций на производительность запросов.


Не существует идеального ответа на этот вопрос, он связан с делом, с которым вы работаете, но яМожно дать несколько советов, которые вы можете принять во внимание:

  • Во-первых, если вы используете SSIS для импорта данных в промежуточную таблицу, попробуйте заменить пользовательскую функцию компонентами потока данных SSIS, такими как преобразование производного столбца., Поиски, таким образом, что может повысить производительность импорта данных.
  • Если вы не можете заменить UDF на компоненты SSIS: Если вы коллегивысокоскоростное преобразование данных в озеро данных (уровень подготовки) и последующую загрузку данных при необходимости, лучше избегать использования функций при импорте данных в таблицу подготовки.
  • Если вам нужна высокая скорость призагрузка данных из промежуточной таблицы, затем используйте функцию на первом этапе импорта данных.
  • Если первая фаза импорта данных (в промежуточную таблицу) и вторая фаза (из промежуточной таблицы) не выполняются на одном компьютере, может быть лучше выполнить функции на более производительной машине.
  • Если функция содержит некоторые операции, такие как поиск, попробуйте заменить их на объединения.

...

Обновление 1

После публикации функций по вашему вопросу вы можете заменить функцию 2 преобразованием производного столбца в вашем пакете служб SSIS:

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

Также вы можете заменить функцию 1 поискомПреобразование в пакете служб SSIS или с помощью LEFT JOIN в запросе SQL.

...