我有一些看起来像这样的东西:
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();
我的问题是循环的每次迭代都非常慢。问题是MySQL。我想知道是否有可能在 while 循环中放置某种包装器以使其一次获取多个记录,与此同时,将所有记录获取到内存中也不实用。我不担心代码的效率(hashref 与 arrayref 等)。相反,我有兴趣一次获取 10000 条记录。
数据库有大约 500 万条记录。我无法更改/升级服务器。
谢谢
最佳答案
您可以使用接受“maxrows”参数的 fetchall_arrayref 函数:
while (my $data = $dbc->fetchall_arrayref(undef, 10000)) {
for my $row( @{$data} ) {
$report->process_record($row);
}
}
您还可以查看 RowCacheSize该属性试图控制从您的驱动程序获取的数据中返回的记录数。
关于mysql - 加速 perl DBI fetchrow_hashref,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8605322/