1

I need to transfer about 11 million rows daily from one database to another. The source table is about a half a billion rows total at this point.

I was using the "get everything since ?" method, using the max in the destination as the ?, but the maintenance of the source is kind of funky. They keep going back to fill holes and my method isn't working.

The standard Lookup transform takes hours to run. Pragmatic's TaskFactory has an Upsert component, but it's not in this project's budget.

Is there a better way than Lookup to lookup?

4

2 回答 2

3

以下是一些选项:

A. 通过实施某种 CDC 来减少输入数据(在您所说的数量和数据可变性上,您应该真正考虑这一点)。您在源头有哪些 CDC 选项(即您可以创建触发器和日志记录表吗?您是否有支持本机 CDC 的 SQL Server 版本?)

B. 将输入数据加载到临时表中并使用 INSERT/UPDATE 或 MERGE 将其应用到目标表

C. 将输入数据加载到临时表中并删除/插入(基于日期范围)以将其应用于目标表。这是我通常做的。您的加载过程应该能够在给定的日期范围内运行并智能地仅加载该数据,将其从目标中删除并重新加载。

恕我直言,SSIS 查找组件对您所说的数据量没有用。

于 2014-04-30T00:27:39.737 回答
1

我更喜欢尽可能地扩展完全刷新,例如截断目标表并提供所有行而不进行任何查找等。我有一个这样的,它可以在 3 小时内咀嚼近 1b 行。大多数人最初对这种方法感到恐惧,但它确实有效,并且非常可靠且易于编码和测试。

或者,我会使用带有 SQL MERGE 语句的执行 SQL 任务。这使您可以非常详细地控制所考虑的源行和目标行、它们的匹配方式以及之后发生的情况(插入或更新)。

在那个规模下,我会非常小心地创建索引以帮助 MERGE,例如在连接列上。它通常会比完全刷新设计慢得多,并且需要更长的编码和测试时间,并且存在更高的错误风险。

于 2014-04-30T00:17:18.220 回答