我正在使用最新版本的 MySQL(工作台)、Perl 和 DBI。
我有两个唯一的数据库,每个数据库都在唯一的服务器上。我在 Server1 上的 DB1 上查询 table1,加载到一个数组中,然后while
将所述表插入到 Server2 上的 DB2 上的 table2 中。
它不是直接副本,因为我实际上是在表 1 上进行选择。
我正在尝试加快我的脚本或在必要时更改查询。
我正在使用绑定并将准备语句移出循环,这确实有帮助。但是,我最终还是调用了 160 万次插入到 table2/db2/server2 的调用,这会占用大量时间(每次调用 3100 秒或大约 2-3 毫秒)。
有两个子 &insert2tempData 在while
循环中用于加载我的 DB2 table2。它被调用了 160 万次 AND query_dev_load_local_dbs 用于查询 DB1 然后调用第二个 sub。
为简单起见,我将此准备留在循环中,但在我的代码中,它不在循环中,而是在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 的主要 sub。它调用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