【问题标题】:How to ensure consistency with multiple SSIS-packages filling the same tables?如何确保与填充相同表的多个 SSIS 包的一致性?
【发布时间】:2014-08-30 11:07:11
【问题描述】:

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

  1. 使用来自数据源 1 的数据填充维度表
  2. 用来自数据源 1 的数据填充 Fact 表(正确的代理键为 Dim)
  3. 使用来自数据源 2 的数据填充维度表
  4. 用数据源 2 中的数据填充 Fact 表(正确的代理键为 Dim)

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

  1. 两个包几乎同时启动
  2. 使用数据源 1 中的数据填充维度表
  3. 使用来自数据源 2 的数据填充维度表
  4. 用数据源 2 中的数据填充 Fact 表(错误 Dim 记录的代理键)
  5. 用数据源 1 中的数据填充 Fact 表(错误 Dim 记录的代理键)

是否有任何常见的最佳实践,或者另一方面,是否有必要进行这种处理,或者 SQL Server 默认情况下会处理这种情况,例如通过禁止并行处理包?也许在每个 SSIS 包启动期间两个表上的 Write Lock 可能是令人满意的,但在这种情况下,我担心如果它无法到达目标表,这可能会导致另一个 SSIS 包抛出失败。我是 SSIS 的新手,我想知道我有哪些好的技术可以避免这种情况(如有必要)。

【问题讨论】:

    标签: ssis real-time scheduling


    【解决方案1】:

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

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

    【讨论】:

    • 我的问题适用于时间戳维度。在我的情况下,可以获得具有完全相同时间戳的多行,因此我没有找到自然键的智能解决方案。我使用自动增量 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]
    • 我同意你的模型。您的问题有两个步骤:1) 在 DimTimestamp 中插入新的时间戳。确保不要插入重复项。一个简单的选择是使用临时表和 SQL MERGE 语句。 2) 在 Fact 表中插入你的事实。然后,我将通过使用构成自然键的 5 列(日 + 月 + 年 + 小时 + 分钟)查找匹配项来找到正确的 TimestampID。询问您是否需要有关其中一个步骤的更多详细信息。
    • 我花了一些时间,但我按照你的建议实现了我的时间戳维度。这个解决方案比我以前的解决方案好得多。我看到我现在不必担心提到的一致性问题。谢谢!!!
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-12
      • 2021-03-09
      • 2017-02-15
      • 2016-03-17
      • 1970-01-01
      • 2022-10-07
      • 1970-01-01
      • 2019-02-25
      相关资源
      最近更新 更多