如何确保填充相同表的多个SSIS包的一致性?

时间:2014-08-30 11:07:12

标签: ssis real-time scheduling

我有一个包含2个数据流任务的SSIS包。第一个数据流任务是将值填充到维度表中。第二个数据流任务是将代理键填充到事实表中。事实表通过代理键引用先前填充的维度表。但是,另一个SSIS包的功能完全相同,但使用来自其他数据源的数据。两个SSIS包都由SQLServer Agent以低频率(每20-40秒)触发。 我担心一致性。如果我有一个SSIS包将数据加载到维度表和事实表中,我不会因为可以创建控制流来强制执行以下序列:

  1. 使用数据源1
  2. 中的数据填充Dimension表
  3. 使用数据源1中的数据填充Fact表(正确的代理键为Dim)
  4. 使用数据源2
  5. 中的数据填充Dimension表
  6. 使用数据源2中的数据填充Fact表(正确的代理键为Dim)
  7. 因此,在这种情况下,Dimension表的主键以及事实表中相应的代理键可以在SQL Server DB中自动递增,一切都会好的。 但由于我有2个SSIS包,每个包都在低频率的多核ETL服务器上独立运行,我担心会发生以下情况:

    1. 两个包大约在同一时间开始
    2. 使用数据源1
    3. 中的数据填充Dimension表
    4. 使用数据源2
    5. 中的数据填充Dimension表
    6. 使用数据源2中的数据填充Fact表(代理键到错误的Dim记录)
    7. 使用数据源1中的数据填充Fact表(代理键到错误的Dim记录)
    8. 是否有任何常见的最佳做法,或者另一方面,是否需要这样的处理,或者SQL Server默认处理这种情况,例如禁止包并行处理?在每个SSIS包开始时,两个表上的Write Lock可能都令人满意,但在这种情况下,我担心如果它无法到达目标表,这可能会导致其他SSIS包丢失。我是SSIS的新手,我想知道我对避免这种情况的任何好技术的选择(如有必要)。

2 个答案:

答案 0 :(得分:1)

一种选择是在SSIS中使用transactions。您可以在事务中嵌入ETL的关键部分。

但我不确定是什么让你认为可能存在问题。如果在维度表上使用标识列,则无论同时插入多少个线程,都不能存在重复项。在你的第4步和第5步中,你如何获得错误记录的代理?请举例说明您的计划如何将您的事实与您的Dim记录相匹配。

答案 1 :(得分:0)

如果我正确理解了您的查询,您可以使用的另一个选项是将它们作为一个包并使用序列容器,如果您不想这样做,您仍然可以在控制流中将它们与执行SSIS包合并任务,这样你就可以控制流程,而一个包只会在另一个包之后运行。唯一的缺点就是程序包在执行时需要再次初始化,所以只需合并然后创建数据就可能更好了。它们的来源在同一个包中。