首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >加速perl DBI fetchrow_hashref

加速perl DBI fetchrow_hashref
EN

Stack Overflow用户
提问于 2011-12-22 22:32:40
回答 3查看 3.8K关注 0票数 6

我有一个类似这样的东西:

代码语言:javascript
复制
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 vs arrayref等)。相反,我感兴趣的是一次获取10000条记录。

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

谢谢

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-12-22 22:45:56

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

代码语言:javascript
复制
while (my $data = $dbc->fetchall_arrayref(undef, 10000)) {
  for my $row( @{$data} ) {
    $report->process_record($row);
  }
}

您还可以查看RowCacheSize属性,该属性试图控制从驱动程序获取时返回的记录数量。

票数 8
EN

Stack Overflow用户

发布于 2011-12-23 00:57:57

哪个比特速度慢?是对executefetchrow_hashref还是process_record的调用?在我看来fetchrow_hashref不太可能是问题所在。它更有可能是查询的执行或process_record的黑盒。

但这一切都是猜测。在这里是不可能真正有帮助的。我建议您使用Devel::NYTProf获取一些关于代码性能的真实数据。

票数 4
EN

Stack Overflow用户

发布于 2011-12-30 07:42:31

使用DBI将行作为散列提取的最快方法是使用bind_columns(),如下所示:

代码语言:javascript
复制
  $sth->execute;
  my %row;
  $sth->bind_columns( \( @row{ @{$sth->{NAME_lc} } } ));
  while ($sth->fetch) {
      print "$row{region}: $row{sales}\n";
  }

只有当您乐于让每一行重用相同的散列时,这才是合适的。

除此之外,我同意davorg的观点,避免猜测:首先测量。

有关使用DBI的更多信息,包括性能,请参阅my tutorial slides (来自2007年,但仍然相关)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8605322

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档