【问题标题】:SQL Server - copy data and transformation in a small time windowSQL Server - 在小时间窗口中复制数据和转换
【发布时间】:2014-01-09 21:04:12
【问题描述】:

我们有一个 SQL Server 2008 数据库。数据库需要从 3 个独立的服务器复制数据。复制数据后,我们进行数据转换(反规范化等)

使用在夜间小窗口(3 小时)中运行的 SSIS 包复制数据。例如:

  • 作业 A 在 1-2 之间运行
  • 工作 B 2-3
  • 工作4 2-3

这会导致一些问题:

  • 随着数据的增长,作业 A 无法在 2 之前完成,作业 B 启动并失败
  • 有时,作业会在维护窗口之外运行
  • 每个数据复制作业都会创建一些其他 SQL 作业
  • 生成的 SQL 作业发生冲突,导致错误

我正在考虑解决此问题的一种方法是 - 使用单独的临时数据库,它将整天复制数据,然后设置 SQL 复制到生产数据库。

我们还需要一个排队系统,以便作业可以具有优先级、依赖关系等,因为有些作业是顺序的,有些可以并行运行。

还有其他更好的方法来解决这个问题吗?对于我们的选项的任何帮助将不胜感激。

【问题讨论】:

标签: .net sql-server architecture ssis etl


【解决方案1】:

您能否发布有关此声明的更多信息?

“随着数据的增长,作业 A 无法在 2 之前完成,作业 B 启动并失败”。

您的错误消息的详细列表将很有帮助。我想知道的是……

1) 您的错误是由于硬件资源限制造成的吗?

或

2) 可以通过在 SSIS 中的包中添加Precedence Constraints 来解决吗?

或

3) 两者都发生了吗?

如果我暂时假设问题的一部分至少可以通过在 SSIS 包中添加优先约束来解决,通常遇到的情况是这样的:

我有几个单独运行时运行良好的软件包。然而,当他们一起奔跑时,他们之间的相处并不融洽。更重要的是,我真的没有心情,也没有时间将这几个包重新设计/重构为一个具有所需优先级约束的大包。

当这种情况发生时,这个解决方案就会出现:

  1. 创建一个新的“父”包
  2. 将Execute Package tasks 添加到父包中以调用您的子包
  3. 使用优先约束,约束每个子包在硬件资源允许和数据模型要求的情况下以尽可能多或尽可能少的并行度运行

这个父包中将有没有数据流任务。相反,它的唯一目的是管理控制流逻辑。如果这为您提供了所需的性能,并且不只是用作真正需要完成的包重构的解决方法,那么它是一个可行的选择。当然,要让它“正确”是一个反复试验的问题。

一般来说,我会说我更喜欢以控制流为主题的父包而不是复杂的 SQL Server 代理作业,因为我觉得 SSIS 更易于配置,为您提供更大的灵活性,并且这种方法允许您将 ETL 逻辑封装在SSIS 而不是将其分散在 SSIS 和 SQL Server 代理上。对于我的许多 ETL 任务,我对 SQL Server 代理的使用归结为调度和一个简单的步骤,即调用以控制流为主题的父包。

我会说使用单独的临时表作为解决问题的一种方式也值得研究。这更像是数据模型的事情,最好留给数据模型专家。如果您当前的数据模型不允许包并行运行(例如,多个进程通过批量插入将数据同时插入到同一个表中),那么这种方法会有所帮助。但是,如果性能的根本问题是硬件资源限制,那么多临时表解决方案不是一个很好的选择。

我猜想最终要找到最佳性能,您可能最终会混合使用这两种解决方案,并且可能会为您的 ETL 请求额外的硬件资源。

如果您的问题没有更多详细信息,很难知道该推荐什么。希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2011-06-28
    • 2021-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-01
    • 1970-01-01
    • 2022-01-21
    • 2021-12-24
    相关资源
    最近更新 更多