Azure 数据工厂 V2:为 SQL 合并复制或存储过程 activity

Azure Data Factory V2: Copy OR Stored Procedure activity for SQL merge

我们的 Azure 数据工厂 v2 解决方案中有多个数据库 table 合并步骤。我们将 table 合并到 Azure SQL 服务器数据库的单个实例中。源 table 和目标 table 位于不同的数据库架构中。源被定义为单个 table 上的 select 或两个 table 的连接。

我的疑问是,从性能的角度来看,下面描述的场景中哪一个更好。

场景一(根据 table)

存储过程activity 调用执行所有工作的存储过程。 管道中的存储过程 activity 调用该存储过程。使用所有源数据更新目标 table。此类存储过程的示例:

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;

场景二(每行)

副本 activity 声明一个存储过程以在“目标”选项卡中调用,以便 activity 为源的每一行调用存储过程。

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 类型定义为遵循目标 table 结构的 table 类型。

场景 1 应该有更好的性能,但考虑了以下优化:

  1. 在源 table 中的连接列上创建一个唯一且覆盖的索引。
  2. 在目标 table 中的连接列上创建唯一聚集索引。
  3. 参数化 ON 子句和 WHEN 子句中的所有文字值。
  4. 通过使用 OFFSET 和 ROWS FETCH NEXT 或通过在 return 筛选行的源或目标上定义视图并将视图引用为,将源的数据子集合并到目标 table源或目标 table。此外,不建议使用 TOP 子句的 WITH 子句从源或目标 table 中过滤掉行,因为它们会生成不正确的结果。
  5. 要进一步优化合并操作,请尝试不同的批量大小。 Here是原因。