将数百万行从源数据库表传输到目标数据库表的正确方法

时间:2014-02-20 15:39:37

标签: sql-server pentaho etl kettle

我遇到了同样的问题而没有一个好的通用解决方案 -

场景是:

  • 我在数据库(如MS SQL Server)中有一个源表 几百万行。总共有几个Gb的表数据。
  • 我想 将这些行插入另一个系统中的目标表。这个 部分我觉得很舒服,似乎运作良好。

问题是运行单个线程来读取单个选择/连接中的所有X百万行总是遇到问题。所以我希望Pentaho让我说多次选择并按“批处理”处理100K或500K行并继续处理,直到没有更多的行。

我可以硬编码一个简单的脚本来运行pan.sh,其中包含一个起始行和批量大小的命名参数 - 这很有效但我必须预先计算脚本步骤和实际的起始行号。

理想情况下,我希望Pentaho可以在Table Input步骤中设置“Number of Copies”和批量大小,这样它就会自动化!

是否有人拥有获取表的行计数的示例作业定义 - 然后“循环”对转换的调用,直到处理完所有行为止?也许一些批次可以并行运行以获得额外的信用。

1 个答案:

答案 0 :(得分:1)

啊,你打电话了?

是;这样做的方法确实是使用多个副本,然后使用步骤和mod函数的“数字”。

因此;如果您有2个副本,如果您说:

where rownum % 2 = 0
在查询中

然后你将拉出每一秒。

rownum可以是ID或其他一些数字列 - 当然需要是均匀分布的ID。如果索引也有帮助 - 如果它是底层数据库分区的一部分,则会特别好。

此方法也适用于慢速网络连接 - 允许您加载与数据库的多个连接。

Doco在这个jira中使用的变量:

http://jira.pentaho.com/browse/PDI-3253

如果您希望保持“分区”向下游流动,那么它就是您的选择。