Ускорение Perl DBI fetchrow_hashref - PullRequest
       3

Ускорение Perl DBI fetchrow_hashref

6 голосов
/ 22 декабря 2011

У меня есть что-то похожее на это:

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 записей одновременно.

В базе данных ~ 5 миллионов записей. Я не могу изменить / обновить сервер.

Спасибо

Ответы [ 3 ]

8 голосов
/ 22 декабря 2011

Вы можете использовать функцию fetchall_arrayref, которая принимает аргумент 'maxrows':

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

Вы также можете посмотреть на свойство RowCacheSize , которое пытается контролировать, сколько записей возвращается вполучить от вашего водителя.

4 голосов
/ 22 декабря 2011

Какой бит медленный?Это вызов execute, fetchrow_hashref или process_record?Мне кажется маловероятным, что проблема заключается в fetchrow_hashref.Скорее всего, это будет выполнение запроса или черный ящик process_record.

Но это все догадки.Здесь невозможно реально помочь.Я рекомендую вам получить реальные данные о производительности кода, используя Devel :: NYTProf .

3 голосов
/ 30 декабря 2011

Самый быстрый способ извлечения строк в виде хэшей с использованием DBI - использовать bind_columns(), например:

  $sth->execute;
  my %row;
  $sth->bind_columns( \( @row{ @{$sth->{NAME_lc} } } ));
  while ($sth->fetch) {
      print "$row{region}: $row{sales}\n";
  }

Это подходит только в том случае, если вы счастливы, что каждая строка повторно использует один и тот же хэш.

Помимо этого, я согласен с davorg, избегайте догадок: сначала измерьте.

Более подробную информацию об использовании DBI, включая производительность, см. В моих учебных слайдах (от 2007 г.)., но все еще актуально).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...