Увеличение суррогатного ключа SSIS

Я использую SSIS для создания звездообразной схемы для хранилища данных с суррогатными ключами (sg).

Мой процесс выглядит следующим образом:

  1. найти max sg (используя SQL)

  2. в потоке данных: источник данных-> сценарий С#, который добавляет +1 к максимальному sg -> запись в место назначения.

Теперь с фиксированными размерами работает без проблем. Каждая добавленная строка получает последовательный sg.

Однако, когда я использую медленно меняющееся измерение и исторически обновляю строку, я получаю следующее:

sg_key  |  name | city | current_row
1       |  a    |  X   | true
2       |  b    |  Y   | true
3       |  c    |  Z   | false
4       |  d    |  H   | true
7       |  c    |  T   | true

Теперь поправьте меня, если я ошибаюсь, но я всегда думал, что SSIS проталкивает одну строку за раз через все задачи потока, но похоже, что сначала он генерирует ВСЕ sg_keys для всех строк, а затем отправляет обновленную строку через поток. .

Я правильно понимаю, что SSIS работает неправильно? Как я могу это исправить?

Здоровья, Марк.


person mRiddle    schedule 04.01.2017    source источник
comment
Поскольку вы генерируете ключ, а затем передаете его в SCD , это, скорее всего, следствие вашей логики C#. Генерирует ли этот код уникальный ключ для каждой строки, даже если строка не новая? Управление SKeys может быть настоящей болью. Я бы поддержал совет @ArnaudGastelblum. Пусть SQL Server сделает это за вас.   -  person David Rushton    schedule 04.01.2017
comment
Код генерирует новый sg для каждой строки. Однако я так понимаю, что, поскольку неизмененные строки больше не помещаются в целевую таблицу, ключ max sg останется прежним, пока не появится обновленная строка.   -  person mRiddle    schedule 04.01.2017
comment
Можете ли вы показать нам код? Я предполагаю, что ваш конвейер следует этому базовому шаблону: Задача потока данных (Источник > > Задача сценария > > Назначение). Это правильно?   -  person David Rushton    schedule 04.01.2017
comment
Да, это моя поточная задача. Не знаю, как поместить сюда фрагмент кода: [Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute] public class ScriptMain: UserComponent { private int NextKey = 0; public override void Input0_ProcessInputRow (Input0Buffer Row) { int MaxKey = Variables.MaxSgKey; если (NextKey == 0) { NextKey = MaxKey + 1; } еще { NextKey = NextKey + 1; } Row.SgKey = NextKey; } }   -  person mRiddle    schedule 04.01.2017
comment
Ты прав. В потоке данных; строки обрабатываются по одной. В этом случае каждая строка из источника передается в скрипт, который увеличивает счетчик суррогатов. Затем ряд переходит в SCD. Если SCD не создает новую строку, новое суррогатное значение не используется. Если вы хотите избежать неиспользуемых суррогатных значений, вам нужно будет обновить логику C#, чтобы увеличивать только новые строки. Конечно, вы можете возразить, что не имеет значения, если суррогатные ключи прыгают с 4 на 7. Их значение не имеет значения. Важно только то, что они уникальны и последовательны.   -  person David Rushton    schedule 04.01.2017
comment
Ок, понял. Я думал, что если значение sg не использовалось, поток данных начнется с расчета предыдущего шага, но похоже, что максимальные значения рисуются только один раз (шагом sql), а затем в поток данных. Поэтому мне нужно либо различать случай, когда sg не записывается, либо искать другие инструменты для увеличения sg.   -  person mRiddle    schedule 04.01.2017


Ответы (1)


Если вы используете SQL Server в качестве места назначения, почему бы не использовать столбец IDENTITY? (вместо скрипта C#)

https://msdn.microsoft.com/en-us/library/ms186775.aspx

Identity будет автоматически увеличивать ваш столбец при вставке новой строки. Если вы не обновите этот столбец, значение не изменится.

Арно

person Arnaud Gastelblum    schedule 04.01.2017