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)
我从类似的线程实现了一些解决方案,但它仍然很慢.当然必须有更好的方法吗?
如果将它包装到一个事务中,它应该更快地工作.使用这样的东西:
$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)
如果您有数百万行,则可能需要每隔几千行执行一次提交.
现在,它更快的原因:
在您的情况下,每个插入都是一个自动提交的事务.换句话说,服务器必须等到你的更改真正刷新到每个数百万行的每一行 - 非常慢!
当您将其包装到事务中时,服务器可以同时将数千行刷新到磁盘 - 效率更高,速度更快.
(如果你一遍又一遍地复制完全相同的表,那么通过某种独特的密钥同步更改会更明智 - 应该快一百万倍).
| 归档时间: |
|
| 查看次数: |
1855 次 |
| 最近记录: |