簡體   English   中英

使用perl和DBI將一個非常大的表從一個DB2復制到另一個DB2

[英]copying a very large table from one DB2 to another, using perl and 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});
}

我從類似的線程實現了一些解決方案,但它仍然很慢。 當然必須有更好的方法嗎?

如果將它包裝到一個事務中,它應該更快地工作。 使用這樣的東西:

$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();

如果您有數百萬行,則可能需要每隔幾千行執行一次提交。

現在,它更快的原因:

在您的情況下,每個插入都是一個自動提交的事務。 換句話說,服務器必須等到你的更改真正刷新到每個數百萬行的每一行 - 非常慢!

當您將其包裝到事務中時,服務器可以同時將數千行刷新到磁盤 - 效率更高,速度更快。

(如果你一遍又一遍地復制完全相同的表,那么通過某種獨特的密鑰同步更改會更明智 - 應該快一百萬倍)。

除了mvp所說的這里是DBI文檔的一個片段:

 my $sel = $dbh1->prepare("select foo, bar from table1");
  $sel->execute;

  my $ins = $dbh2->prepare("insert into table2 (foo, bar) values (?,?)");
  my $fetch_tuple_sub = sub { $sel->fetchrow_arrayref };

  my @tuple_status;
  $rc = $ins->execute_for_fetch($fetch_tuple_sub, \@tuple_status);
  my @errors = grep { ref $_ } @tuple_status;

當與mvp的答案結合使用時應該更快,特別是如果DBD :: DB2有自己的execute_for_fetch方法(我不知道)。 具有自己的execute_for_fetch方法的DBD通常會批處理操作。 但是,無論如何它應該快一點。

如果你每天這樣做,我會認為DB2的exportimport實用程序將是你要走的路。 這樣很可能比多個SQL 快得多 INSERT語句。

您可以使用Perl的DBI模塊執行此操作,但如果需要在Perl腳本中完成此操作,則可能必須使用system或反引號。

如果可以將源數據庫中的內容發送到文件,則可以使用LOAD命令或INGEST實用程序。 LOAD非常快,因為它不使用日志。 INGEST是正常插入,但可以重新啟動。

可以從Perl調用這些命令,剩下的就是DB2。

但是,如果源數據庫和目標數據庫是DB2,則可以聯合目標中的源。 這意味着,您可以在目標數據庫中看到遠程表(來自源)。 在這種情況下,你只需要調用一個LOAD,就是這樣。 它將是最快的,因為通信是在DB2和DB2之間,而不是像DB2 - > Perl - > DB2。

我認為最好讓DB2處理大表,讓Perl處於中間位置。 可以探索內存,提交可能是一個問題,等等。

此外,根據您的DB2許可,您可以使用Optim High Performance Unload,以便直接從表空間中提取表,而不是通過SQL(較慢)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM