Ssis 如何确保多个SSI包填充同一个表的一致性?
我有一个包含2个数据流任务的SSIS包。第一个数据流任务是将值填充到维度表中。第二个数据流任务是将代理键填充到事实表中。事实表正在通过代理键引用先前填充的维度表。然而,另一个SSIS包也在做同样的事情,只是使用了来自另一个数据源的数据。SQLServer代理以低频率(每20-40秒)触发两个SSI包。 我担心的是一致性。如果我有一个SSIS包将数据加载到维度表和事实表中,我就不必这样做,因为可以创建控制流来强制执行以下顺序:Ssis 如何确保多个SSI包填充同一个表的一致性?,ssis,real-time,scheduling,Ssis,Real Time,Scheduling,我有一个包含2个数据流任务的SSIS包。第一个数据流任务是将值填充到维度表中。第二个数据流任务是将代理键填充到事实表中。事实表正在通过代理键引用先前填充的维度表。然而,另一个SSIS包也在做同样的事情,只是使用了来自另一个数据源的数据。SQLServer代理以低频率(每20-40秒)触发两个SSI包。 我担心的是一致性。如果我有一个SSIS包将数据加载到维度表和事实表中,我就不必这样做,因为可以创建控制流来强制执行以下顺序: 使用数据源1中的数据填充维度表 用数据源1中的数据填充事实表(Dim的
写锁
可能是令人满意的,但在这种情况下,我担心如果另一个SSIS包无法到达目标表,这可能会导致另一个SSIS包抛出故障。我是SSIS新手,我想知道我可以选择哪些好的技术来避免这种情况(如果必要)。一个选择是在SSIS中使用。您可以在事务中嵌入ETL的关键部分
但我不知道是什么让你认为会有问题。如果在维度表上使用标识列,则无论同时插入多少个线程,都不能重复。在你的第4步和第5步中,你怎么能让一个代理进入一个错误的记录?请举例说明您的问题,说明您计划如何将您的事实与Dim记录相匹配。如果我正确理解您的查询,您可以使用的另一个选项是将它们作为一个包,并使用序列容器。如果您不想这样做,您仍然可以将它们与执行SSIS包任务结合在控制流中,这样,您可以控制流,并且一个包只能在另一个包之后运行。唯一的缺点是,当执行包时,需要再次初始化,因此从形式上看,最好是在同一个包中组合并为它们创建数据源。我的问题适用于时间戳维度。在我的例子中,有可能得到多个具有完全相同时间戳的行,因此我没有找到一个自然密钥的智能解决方案。我使用了自动增量PK:
CREATE TABLE dimtimstamp([timestamp id]INT主键标识(1,1),[DayNumber]TINYINT、[MonthNumber]TINYINT、[drawnumber]SMALLINT、[MinuteNumber]TINYINT、[HourNumber]TINYINT)
在我的事实表中,我看到的唯一方法是通过物理存储的计算列引用该维度:[TimestampID]作为[FactTableID]保留的外键引用[dbo]。[DimTimestamp]
我同意您的模型。您的问题有两个步骤:1)在DimTimestamp中插入新的时间戳。确保不要插入重复的时间戳。一个简单的选择是使用暂存表和SQL MERGE语句。2)在事实表中插入事实。然后,我将通过使用提供数据的5列查找匹配项来找到正确的时间戳IDrm您的自然密钥(天+月+年+小时+分钟)。询问您是否需要关于其中一个步骤的更多详细信息。这花费了我一些时间,但我按照您的建议实现了我的时间戳维度。此解决方案比上一个解决方案要好得多。我发现我现在不必担心提到的一致性问题。谢谢!!!