使用perl和DBI将一个非常大的表从一个DB2复制到另一个DB2

cos*_*mer 3 sql db2 perl transactions dbi

我需要每天将一个非常大(数百万行)的表从一个DB2 DB复制到另一个DB2 DB,我需要使用perl和DBI.

有没有更快的方法来执行此操作,而不是简单地从第一个数据库中获取每行的fetchrow_array并将它们逐个插入到第二个数据库中?这是我得到的:

$sth1 = $udb1 -> prepare($read_query);
$sth1 -> execute();
$sth1 -> bind_columns(\(@row{@{$sth1 -> {NAME_1c}}}));

$sth2 = $udb2 -> prepare($write_query);

while ($sth1 -> fetchrow_arrayref) {
    $sth2 -> execute($row{field_name_1}, $row{field_name_2});
}
Run Code Online (Sandbox Code Playgroud)

我从类似的线程实现了一些解决方案,但它仍然很慢.当然必须有更好的方法吗?

mvp*_*mvp 5

如果将它包装到一个事务中,它应该更快地工作.使用这样的东西:

$sth1 = $udb1->prepare($read_query);
$sth1->execute();
$sth1->bind_columns(\(@row{@{$sth1->{NAME_1c}}}));

$udb2->begin_work();
$sth2 = $udb2->prepare($write_query);
while ($sth1->fetchrow_arrayref()) {
    $sth2->execute($row{field_name_1}, $row{field_name_2});
}
$udb2->commit();
Run Code Online (Sandbox Code Playgroud)

如果您有数百万行,则可能需要每隔几千行执行一次提交.

现在,它更快的原因:

在您的情况下,每个插入都是一个自动提交的事务.换句话说,服务器必须等到你的更改真正刷新到每个数百万行的每一行 - 非常慢!

当您将其包装到事务中时,服务器可以同时将数千行刷新到磁盘 - 效率更高,速度更快.

(如果你一遍又一遍地复制完全相同的表,那么通过某种独特的密钥同步更改会更明智 - 应该快一百万倍).