我们的Azure Data Factory v2解决方案中有许多数据库表合并步骤。我们将表合并到Azure SQL Server数据库的单个实例中。源表和目标表位于不同的数据库模式中。源定义为对单个表的选择或对两个表的联接。
我的疑问是,从性能的角度来看,下面介绍的哪种方案更好。
存储过程活动将调用执行所有工作的存储过程。 管道中的存储过程活动将调用该存储过程。使用所有源数据向上插入目标表。这样的存储过程的示例:
create or alter procedure dwh.fill_lnk_cemvypdet_cemstr2c_table_with_stage_data as
merge
dwh.lnk_cemvypdet_cemstr2c as target
using
(select
t.sa_hashkey cemvypdet_hashkey,
t.sa_timestamp load_date,
t.sa_source record_source,
d.sa_hashkey cemstr2c_hashkey
from
egje.cemvypdet t
join
egje.cemstr2c d
on
t.id_mstr = d.id_mstr)
as source
on target.cemvypdet_hashkey = source.cemvypdet_hashkey
and target.cemstr2c_hashkey = source.cemstr2c_hashkey
when not matched then
insert(
cemvypdet_hashkey,
cemstr2c_hashkey,
record_source,
load_date,
last_seen_date)
values(
source.cemvypdet_hashkey,
source.cemstr2c_hashkey,
source.record_source,
source.load_date,
source.load_date)
when matched then
update set last_seen_date = source.load_date;
Copy活动在“目标”选项卡中声明要调用的存储过程,以便该活动为源的每一行调用存储过程。
create or alter procedure dwh.fill_lnk_cemvypdet_cemstr2c_subset_table_row_with_stage_data
@lnk_cemvypdet_cemstr2c_subset dwh.lnk_cemvypdet_cemstr2c_subset_type readonly
as
merge
dwh.lnk_cemvypdet_cemstr2c_subset as target
using
@lnk_cemvypdet_cemstr2c_subset
as source
on target.cemvypdet_hashkey = source.cemvypdet_hashkey
and target.cemstr2c_hashkey = source.cemstr2c_hashkey
when not matched then
insert(
hashkey,
cemvypdet_hashkey,
cemstr2c_hashkey,
record_source,
load_date,
last_seen_date)
values(
source.hashkey,
source.cemvypdet_hashkey,
source.cemstr2c_hashkey,
source.record_source,
source.load_date,
source.load_date)
when matched then
update set last_seen_date = source.load_date;
@ lnk_cemvypdet_cemstr2c_subset类型定义为遵循目标表结构的表类型。
答案 0 :(得分:1)
方案1应该有更好的性能,但要考虑以下优化: