Фабрика данных Azure версии 2: копирование или действие хранимой процедуры для слияния SQL

У нас есть несколько шагов слияния таблиц БД в нашем решении фабрики данных Azure 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;

Сценарий второй (в каждой строке)

Действие копирования объявляет хранимую процедуру для вызова на вкладке «Цель», чтобы действие вызывало хранимую процедуру для каждой отдельной строки источника.

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 определяется как тип таблицы, который следует структуре целевой таблицы.


comment
Поскольку исходная и целевая таблицы находятся в одной базе данных, решение 1 должно быть лучше. ADF считывает данные из исходной таблицы в свою память, а затем отправляет в целевую таблицу. Передача данных займет много времени и в вашем случае не нужна.   -  person weidi    schedule 03.07.2018


Ответы (1)


Сценарий 1 должен иметь лучшую производительность, но с учетом следующих оптимизаций:

  1. Создайте индекс для столбцов соединения в исходной таблице, который будет уникальным и охватывающим.
  2. Создайте уникальный кластерный индекс для столбцов соединения в целевой таблице.
  3. Параметризуйте все литеральные значения в предложениях ON и WHEN.
  4. Объедините подмножества данных из исходной таблицы в целевую с помощью OFFSET и ROWS FETCH NEXT или путем определения представлений источника или назначения, которые возвращают отфильтрованные строки и ссылаются на представление как на исходную или целевую таблицу. Кроме того, использование предложения WITH предложения TOP для фильтрации строк из исходных или целевых таблиц не рекомендуется, поскольку они могут генерировать неверные результаты.
  5. Чтобы еще больше оптимизировать операцию слияния, попробуйте разные размеры пакетов. Здесь это причина.
person Alberto Morillo    schedule 03.07.2018