Есть два основных подхода к этому:
- Lookup Transformation -> OLE DB Command/OLE DB Destination
- Загрузить все данные в таблицу промежуточной и выполнить MERGE с помощью SQL.
Мое предпочтение относится к последнему, потому что обновление основано на SET, но я использую первое, где знаю, что оно будет преимущественно вставляться.
С первым вы будете в конечном итоге с чем-то задача потока данных, как:
Это является OLE DB Источник из базы данных OLTP, который затем смотрит вверх против вашей базы данных OLAP, чтобы получить суррогатный ключ. Там, где нет совпадения, простая вставка новой записи в OLE DB Destination, когда есть совпадение, она выполняет условное разделение, если какие-либо поля были изменены, она будет использовать команду OLE DB для обновления таблицы OLAP.
Очевидно, что это намного сложнее, чем это, но это охватывает простейший пример.
Вы можете также использовать медленно изменяющуюся Transformation Dimension, чтобы открыть мастера для создания потока данных для вас, который снова становится немного более сложной:
Как было упомянуто, хотя, мое предпочтение для промежуточной таблицы и обновления на основе набора, потому что команда OLE DB выполняется в строке за строкой, поэтому, если вы обновляете миллионы записей, это займет много времени. Вы можете просто создать промежуточную таблицу на базе данных OLAP и переместить данные с использованием простого OLE DB Source и Destination, а затем использовать MERGE
для обновления OLAP таблицы:
MERGE OLAP o
USING Staging s
ON o.BusinessKey = s.BusinessKey
AND o.Type2SCD = s.Type2SCD
AND o.Active = 1
WHEN MATCHED AND o.Type1SCD != s.Type1SCD THEN
UPDATE
SET Type1SCD = s.Type1SCD
WHEN NOT MATCHED BY TARGET THEN
INSERT (BusinessKey, Type1SCD, Type2SCD, Active, EffectiveDate)
VALUES (s.BusinessKey, s.Type1SCD, s.Type2SCD, 1, GETDATE())
WHEN NOT MATCHED BY SOURCE AND o.Active = 1 THEN
UPDATE
SET Active = 0;
выше предполагает, что вы один активную запись на бизнес-ключ и медленно изменяющиеся параметры типа 1 и типа 2, он будет вставлять новую запись, где нет совпадений в BusinessKey и Type2SCD, кроме того, она будет устанавливать любые несогласные записи в исходной таблице в неактивные. Когда есть совпадение, но SCD типа 1 отличается, это будет обновляться.
Стоит отметить, что MERGE has it's downsides, и вы можете захотеть написать набор, основанный на upserts, как отдельные инструкции INSERT и UPDATE.Одна из основных проблем, с которыми я столкнулся, заключается в том, что во всех моих таблицах измерений у меня есть уникальный отфильтрованный индекс на моем BusinessKey
поле WHERE Active = 1
, чтобы убедиться, что есть только одна активная запись, которую MERGE, я написал, должен работать нормально, но не так подробная информация находится в this connect item. Хотя не конец света должен был добавить OPTION (QUERYTRACEON 8790);
до конца всех заявлений MERGE в моем ETL, это было не идеально.
Как вы оцениваете данные как измененные: на основе столбца datetime в соответствующей таблице? – Deepshikha
Является ли наша база данных OLAP реляционной базой данных или кубом SSAS? –
Это рациональная база данных, в которой я создал свой куб на основе этого – Arian