【发布时间】:2014-08-30 11:07:11
【问题描述】:
我有一个包含 2 个数据流任务的 SSIS 包。第一个数据流任务是将值填充到维度表中。第二个数据流任务是将代理键填充到事实表中。事实表通过代理键引用先前填充的维度表。但是,另一个 SSIS 包的功能完全相同,但使用来自另一个数据源的数据。 SQLServer 代理以低频率(每 20 - 40 秒)触发这两个 SSIS 包。 我担心一致性。如果我有一个将数据加载到维度表和事实表中的 SSIS 包,我就不必这样做了,因为可以创建控制流来强制执行以下顺序:
- 使用来自数据源 1 的数据填充维度表
- 用来自数据源 1 的数据填充 Fact 表(正确的代理键为 Dim)
- 使用来自数据源 2 的数据填充维度表
- 用数据源 2 中的数据填充 Fact 表(正确的代理键为 Dim)
因此,在这种情况下,维度表的主键以及事实表中的相应代理键可以简单地在 SQL Server DB 中自动递增,一切都会好起来的。 但由于我有 2 个 SSIS 包,每个包都独立运行在多核 ETL 服务器上,频率较低,我担心会发生以下情况:
- 两个包几乎同时启动
- 使用数据源 1 中的数据填充维度表
- 使用来自数据源 2 的数据填充维度表
- 用数据源 2 中的数据填充 Fact 表(错误 Dim 记录的代理键)
- 用数据源 1 中的数据填充 Fact 表(错误 Dim 记录的代理键)
是否有任何常见的最佳实践,或者另一方面,是否有必要进行这种处理,或者 SQL Server 默认情况下会处理这种情况,例如通过禁止并行处理包?也许在每个 SSIS 包启动期间两个表上的 Write Lock 可能是令人满意的,但在这种情况下,我担心如果它无法到达目标表,这可能会导致另一个 SSIS 包抛出失败。我是 SSIS 的新手,我想知道我有哪些好的技术可以避免这种情况(如有必要)。
【问题讨论】:
标签: ssis real-time scheduling