It is my understanding that the purpose of preparing the statement is to reduce the work you are done each iteration. As written, you are preparing the statement each time, which will add a little time to each pass. Perhaps a better way to do this would be:
# Recommend not using '*' but specifying the field names,
# to future-proof code.
my $query1 = "SELECT * FROM database1.table WHERE ( id = ? );";
my $query2 = "INSERT INTO
database2.table ( value1, value2 )
VALUES ( ?, ? )
;";
my $sth1 = $dbh1->prepare( $query1 ) or die $dbh1->errstr;
my $sth2 = $dbh2->prepare( $query2 ) or die $dbh2->errstr;
foreach my $id ( @big_data_arrray ) {
# Original code had an error
# $sth2->execute was called in both cases
$sth1->execute( $id ) or die $dbh1->errstr;
while ( my @row = $sth1->fetchrow_array ) {
$sth2->execute( @row[0 .. 1] ) or die $dbh2->errstr;
}
$sth1->finish;
}
Instead of performing 2*N (N=number of items in @big_data_array) prepare calls, only 2 prepare calls are used.
Hope that helps.