使用Integration Service合并数据

时间:2014-02-25 12:29:06

标签: sql sql-server ssis etl business-intelligence

请考虑以下情况:

我的数据库中有一张表。我想使用SSIS在我的OLAP数据库中移动这些数据。我可以将所有记录从我的表移动到OLAP数据库。问题是我不知道如何在OLAP环境中应用更改。例如,如果我的表只有100条记录我改变了如何应用这些更改而不是从头开始复制所有记录。

如何合并这两张桌子?

感谢

2 个答案:

答案 0 :(得分:5)

有两种主要方法:

  • 查找转换 - > OLE DB命令/ OLE DB目标
  • 将所有数据加载到临时表,并使用SQL执行MERGE。

我的偏好是针对后者的,因为更新是基于SET的,但我确实使用前者,我知道它将主要是插入。

对于前者,您最终会得到一个类似于数据流的任务:

enter image description here

这是来自OLTP数据库的OLE DB源,然后查找您的OLAP数据库以检索代理键。如果没有匹配,则简单地将新记录插入到OLE DB目标中,当匹配时它执行条件拆分,如果任何字段已更改,则将使用OLE DB命令更新OLAP表。

它显然比这复杂得多,但这涵盖了最简单的例子。

您还可以使用Slowly Changing Dimension Transformation打开向导来为您创建数据流,这又会变得更复杂:

enter image description here

如上所述,我的首选项是用于临时表和基于集的更新,因为OLE DB命令是逐行执行的,因此如果要更新数百万条记录,则需要很长时间。您只需在OLAP数据库上创建一个临时表,并使用简单的OLE DB源和目标移动数据,然后使用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上没有匹配的情况下插入新记录,此外它将设置任何不匹配的记录在源表中处于非活动状态。如果匹配但类型1 SCD不同,则会更新。

值得注意的是MERGE has it's downsides,您可能希望将基于集合的upsert编写为单独的INSERT和UPDATE语句。我遇到的一个主要问题是,在我的所有Dimension表上,我在BusinessKey字段WHERE Active = 1上有一个唯一的过滤索引,以确保只有一条活动记录,我写的MERGE应该可以工作很好,但没有在this connect item中详细说明。虽然不是世界末日必须在我的ETL中的所有MERGE语句的末尾添加OPTION (QUERYTRACEON 8790);,但这并不理想。

答案 1 :(得分:1)

听起来你想要使用增量加载。

前五个教程on this page应该指出正确的方向 - 我发现它们在过去非常有用。