我每天需要将一个非常大(数百万行)的表从一个 DB2 数据库复制到另一个 DB2 数据库,并且我需要使用 perl 和 DBI。
有没有比简单地从第一个数据库中获取每一行并将它们逐一插入到第二个数据库中更快的方法?这是我得到的:
$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});
}
我从类似的线程实现了一些解决方案,但仍然很慢。当然必须有更好的方法吗?
如果将其包装到一个事务中,它的工作速度应该会快得多。
使用这样的东西:
$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();
如果您有数百万行,您可能需要每几千行执行一次提交。
现在,它更快的原因是:
在您的情况下,每个插入都是一个自动提交的事务。换句话说,服务器必须等待,直到您的数百万行中的每一行的更改真正刷新到磁盘 - 非常慢!
当您将其包装到事务中时,服务器可以一次将数千行刷新到磁盘 - 更加高效和快速。
(如果您一遍又一遍地复制完全相同的表,那么通过某种唯一键同步更改会更明智 - 应该快一百万倍)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)