Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ssis 如何确保多个SSI包填充同一个表的一致性?_Ssis_Real Time_Scheduling - Fatal编程技术网

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

Ssis 如何确保多个SSI包填充同一个表的一致性?,ssis,real-time,scheduling,Ssis,Real Time,Scheduling,我有一个包含2个数据流任务的SSIS包。第一个数据流任务是将值填充到维度表中。第二个数据流任务是将代理键填充到事实表中。事实表正在通过代理键引用先前填充的维度表。然而,另一个SSIS包也在做同样的事情,只是使用了来自另一个数据源的数据。SQLServer代理以低频率(每20-40秒)触发两个SSI包。 我担心的是一致性。如果我有一个SSIS包将数据加载到维度表和事实表中,我就不必这样做,因为可以创建控制流来强制执行以下顺序: 使用数据源1中的数据填充维度表 用数据源1中的数据填充事实表(Dim的

我有一个包含2个数据流任务的SSIS包。第一个数据流任务是将值填充到维度表中。第二个数据流任务是将代理键填充到事实表中。事实表正在通过代理键引用先前填充的维度表。然而,另一个SSIS包也在做同样的事情,只是使用了来自另一个数据源的数据。SQLServer代理以低频率(每20-40秒)触发两个SSI包。 我担心的是一致性。如果我有一个SSIS包将数据加载到维度表和事实表中,我就不必这样做,因为可以创建控制流来强制执行以下顺序:

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

  • 两个包几乎同时启动
  • 使用数据源1中的数据填充维度表
  • 使用数据源2中的数据填充维度表
  • 用数据源2的数据填充事实表(错误Dim记录的代理键)
  • 用数据源1中的数据填充事实表(错误Dim记录的代理键)
  • 是否有任何常见的最佳做法,或者,另一方面,是否有必要进行此类处理,或者SQL Server是否默认处理此类情况,例如,禁止并行处理包?在每个SSIS包启动期间,两个表上的
    写锁
    可能是令人满意的,但在这种情况下,我担心如果另一个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您的自然密钥(天+月+年+小时+分钟)。询问您是否需要关于其中一个步骤的更多详细信息。这花费了我一些时间,但我按照您的建议实现了我的时间戳维度。此解决方案比上一个解决方案要好得多。我发现我现在不必担心提到的一致性问题。谢谢!!!