2014-08-30 16 views
1

我有一个包含2个数据流任务的SSIS包。第一个数据流任务是将值填充到维度表中。第二个数据流任务是将代理键填充到事实表中。事实表通过代理键引用先前填充的维度表。但是,另一个SSIS包完全一样,但是来自另一个数据源的数据。 SQLServer Agent以低频率(每个20-40秒)触发SSIS包。 我很担心一致性。如果我有将数据加载到维表和事实表一个SSIS包,我wouln't得,因为它有可能创造控制流程执行顺序如下:如何确保填充相同表的多个SSIS包的一致性?

  1. 填写维度与来自数据源1
  2. 数据表填写与来自数据源的数据的情况表1(正确代理键至DIM)
  3. 填充规格表与来自数据源2
  4. 数据与来自数据填充事实表数据源2(正确代理键至DIM)

因此,在这种情况下,维度表的主键,以及在事实表中对应的代理键可以自动递增的SQL Server DB简单,一切都会好起来的。 但因为我有2个SSIS包,每个低频多核ETL服务器上独立运行的,我担心的时候将会发生以下情况:

  1. 两种封装都在同一时间开始约
  2. 填充规格表与来自数据源的数据1
  3. 填充规格表与来自数据源的数据2
  4. 用数据填充的事实表从数据源2(代理键错误的昏暗记录)
  5. 用数据填充事实表从数据源1(代理键错误的点心记录)

是否存在,另一方面任何普通的最佳实践,或者,这样的处理需要或不SQL Server的手柄,使得默认情况如通过禁止要并行处理的包?也许每个SSIS包开始时两个表进行Write Lock可能是令人满意的,但在这种情况下,我担心这可能导致由其他SSIS包抛出一个失败,如果不能达到目标表。我是SSIS的新手,我想知道我的选择,以避免出现这种情况(如有必要)。

回答

1

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

但我并不一定要了解是什么让你觉得有可能是一个问题。如果在维度表上使用标识列,则不能重复,无论同时插入多少个线程。在你的第四步和第五步中,你怎么能得到一个错误记录的代理?请举例说明您如何计划将您的事实与您的Dim记录匹配。

+0

我的问题适用于时间戳维度。在我的情况下,有可能获得具有完全相同时间戳的多行,所以我没有找到一个自然键的智能解决方案。我用自动递增PK:'CREATE TABLE DimTimestamp( [TimestampID] INT PRIMARY KEY IDENTITY(1,1), [DayNumber] TINYINT, [MonthNumber] TINYINT, [YearNumber] SMALLINT, [MinuteNumber] TINYINT, [HourNumber] TINYINT)'在我的事实表中,我看到的唯一方法是通过物理存储的计算列引用该维度:'[TimestampID] AS [FactTableID] PERSISTED FOREIGN KEY REFERENCES [dbo]。[DimTimestamp]' – 17nxo 2014-09-02 19:09:04

+0

我同意与你的模型。问题中有两个步骤:1)将新时间戳插入* DimTimestamp *。确保不要插入重复项。一个简单的选择是使用登台表和SQL MERGE语句。 2)在* Fact *表中插入你的事实。然后,我会通过使用形成您的自然键(日+月+年+小时+分)的5列找到匹配来找到适当的TimestampID。询问是否需要关于其中一个步骤的更多细节。 – Ndech 2014-09-02 19:22:47

+1

我花了一些时间,但我实现了我的时间戳维度,就像你所建议的。这个解决方案比我以前的解决方案更好。我看到我现在不必担心提到的一致性问题。谢谢!!! – 17nxo 2014-09-04 09:33:39

0

如果我正确地理解您的查询,您可以使用另一种选择就是让他一个包,并使用序列容器,如果你不希望这样做你仍然可以将它们组合起来在控制流程与执行SSIS包任务,这样你就可以控制流量,一个包只能在另一个之后运行。唯一的缺点是,程序包在执行时需要重新初始化,所以在同一个程序包中合并然后创建数据源可能会更好。

相关问题