MySQL(workbench)、Perl、およびDBIの最新バージョンを使用しています。
それぞれ固有のサーバー上に2つの固有のデータベースがあります。Server1のDB1のtable1にクエリを実行し、配列にロードしてから、while
Server2のDB2のtable2にそのテーブルを挿入しています。
私は実際にテーブル1で選択を行っているので、これは直接のコピーではありません。
スクリプトを高速化するか、必要に応じてクエリを変更しようとしています。
私はバインドを使用していて、prepareステートメントをループの外に移動しました。これは本当に役に立ちました。ただし、table2 / db2 / server2に挿入するために160万回の呼び出しを行うことになり、膨大な時間(3100秒または呼び出しあたり約2〜3ミリ秒)を使用します。
while
DB2 table2をロードするためにループで使用される2つのサブ&insert2tempDataがあります。これは160万回呼び出され、DB1にクエリを実行してから2番目のサブを呼び出すために使用されるquery_dev_load_local_dbsです。
簡単にするために、この準備をループ内に残しましたが、私のコードでは、これはwhile
ループ内ではなく、このサブを呼び出すサブ内にあります。
sub insert2tempData {
$query4tmpData = $Locdbh_NetCool->prepare ("INSERT INTO kpincpolldata.kpitempData
(monitoredObjectId, monitoredInstId, pollTime, tdwTime, errorCode, value)
VALUES(?, ?, ?, ?, ?, ?)");
$query4tmpData->execute($row[0], $row[1], $row[2], $row[3], $row[4],
$row[5]);
warn "Problem in retrieving results", $query4tmpData->errstr(), "\n"
if $query4tmpData->err();
} #End sun insert to tempData
これは、server1、DB1、およびtable1のクエリに使用されるメインサブです。while
ループを呼び出します
sub query_dev_load_local_dbs {
$queryRemote = $Devdbh_NetCool->prepare("SELECT * FROM ncpolldata.pollData
WHERE pollTime >= $STARTU AND pollTime < $ENDU
AND monitoredObjectId = 1");
$queryRemote->execute();
while (@row = $queryRemote->fetchrow_array()) {
#** Call to sub insert2tempData**
&insert2tempData($Locdbh_NetCool);
warn &print2log ("Problem in retrieving results"), $queryRemote->errstr(), "\n"
if $queryRemote->err();
} # End while
} # End sub query_dev_load_local_dbs