加速perl DBI fetchrow_hashref

Sma*_*elf 6 mysql sql database perl performance

我有一些看起来像这样的东西:

my $report = new ReportGenerator; #custom object
my $dbh = $dbc->prepare('SELECT * FROM some_table WHERE some_condition'); #DBI handle
$dbh->execute();
while(my $href = $dbh->fetchrow_hashref){
    $report->process_record($href);
}
$dbh->finish();
print $report->printReport();
Run Code Online (Sandbox Code Playgroud)

我的问题是循环的每次迭代都很慢.问题是MySQL.我想知道是否有可能在while循环中放置某种包装器以使其一次获取多个记录,同时将所有记录提取到内存中也是不实际的.我并不担心代码的效率(hashref vs arrayref等).相反,我有兴趣获取让我们一次说10000条记录.

该数据库有大约500万条记录.我无法更改/升级服务器.

谢谢

Ric*_*ard 8

您可以使用接受'maxrows'参数的fetchall_arrayref函数:

while (my $data = $dbc->fetchall_arrayref(undef, 10000)) {
  for my $row( @{$data} ) {
    $report->process_record($row);
  }
}
Run Code Online (Sandbox Code Playgroud)

您还可以查看RowCacheSize属性,该属性尝试控制从驱动程序获取中返回的记录数.