【发布时间】:2014-04-29 19:16:15
【问题描述】:
我每天需要将大约 1100 万行数据从一个数据库传输到另一个数据库。此时,源表总共大约有 10 亿行。
我使用的是“得到一切,因为?”方法,使用目标中的最大值作为?,但源的维护有点时髦。他们不断回去填补漏洞,我的方法不起作用。
标准查找转换需要数小时才能运行。 Pragmatic 的 TaskFactory 有一个 Upsert 组件,但它不在这个项目的预算之内。
有没有比 Lookup 更好的查找方式?
【问题讨论】:
我每天需要将大约 1100 万行数据从一个数据库传输到另一个数据库。此时,源表总共大约有 10 亿行。
我使用的是“得到一切,因为?”方法,使用目标中的最大值作为?,但源的维护有点时髦。他们不断回去填补漏洞,我的方法不起作用。
标准查找转换需要数小时才能运行。 Pragmatic 的 TaskFactory 有一个 Upsert 组件,但它不在这个项目的预算之内。
有没有比 Lookup 更好的查找方式?
【问题讨论】:
这里有一些选项:
A.通过实施某种 CDC 来减少输入数据(在您所说的数量和数据可变性上,您应该真正考虑这一点)。您对源头的 CDC 有哪些选择(即您可以创建触发器和日志记录表吗?您有支持本机 CDC 的 SQL Server 版本吗?)
B.将输入数据加载到临时表中并使用 INSERT/UPDATE 或 MERGE 将其应用到目标表
C.将输入数据加载到临时表中并删除/插入(基于日期范围)以将其应用于目标表。这是我通常做的。您的加载过程应该能够在给定的日期范围内运行并智能地仅加载该数据,将其从目标中删除并重新加载。
恕我直言,SSIS 查找组件对您所说的数据量毫无用处。
【讨论】:
我更喜欢尽可能延长完全刷新,例如截断目标表并提供所有行而不进行任何查找等。我有一个这样的,它可以在 3 小时内咀嚼近 1b 行。大多数人最初对这种方法感到恐惧,但它确实有效,并且非常可靠且易于编码和测试。
或者,我会使用带有 SQL MERGE 语句的执行 SQL 任务。这使您可以非常详细地控制所考虑的源行和目标行、它们的匹配方式以及之后发生的情况(插入或更新)。
在这种规模下,我会非常小心地创建索引以帮助 MERGE,例如在连接列上。它通常会比完全刷新设计慢得多,并且需要更长的编码和测试时间,存在更高的错误风险。
【讨论】: