我需要每天从一个数据库传输大约1,100万行到另一个数据库。此时源表总共大约有5亿行。
我正在使用"从那以后得到一切?"方法,使用目标中的max作为?,但源的维护是一种时髦。他们不断回去填补空洞,我的方法也没有用。
标准的Lookup转换需要数小时才能运行。 Pragmatic的TaskFactory有一个Upsert组件,但它不在这个项目的预算中。
有没有比Lookup更好的方法来查找?
答案 0 :(得分:2)
以下是一些选项:
一个。通过实施某种类型的CDC来减少输入数据(在您说的卷和数据可变性时,您应该考虑这一点)。你有什么选择CDC源(即你可以创建触发器和日志表?你有一个支持本机CDC的SQL Server版本?)
B中。将输入数据加载到临时表中,并使用INSERT / UPDATE或MERGE将其应用于目标表
℃。将输入数据加载到临时表和DELETE / INSERT(基于日期范围)以将其应用于目标表。这就是我一般所做的。您的加载过程应该能够在给定的日期范围内运行并智能地仅加载该数据,将其从目标中删除并重新加载。
恕我直言,SSIS查找组件对您正在谈论的数据量毫无用处。
答案 1 :(得分:1)
我希望尽可能地延长完全刷新,例如截断目标表并传递所有行而不进行任何查找等。我有一个像这样在3小时内咀嚼近1b行。大多数人都对这种方法感到震惊,但它确实有效并且非常可靠且易于编码和编码。测试
或者,我会使用带有SQL MERGE语句的执行SQL任务。这使您可以非常详细地控制所考虑的源行和目标行,它们如何匹配以及之后发生的事情(插入或更新)。
在那种规模上,我会小心翼翼地创建索引来帮助MERGE,例如在连接的列上。它通常比完全刷新设计慢很多,并且代码和代码需要更长的时间。测试,有更高的漏洞风险。