DBD::mysql por padrão carrega todo o resultado das consultas SQL na memória

Eu estava com problemas de memória ao fazer uma simples consulta SQL via Perl utilizando o módulo DBI com o Mysql. Como eu sabia que a quantidade de registros retornados eram muitos (mais de 100 milhões), acabei utilizando o método fetchrow_array e escrevia a saída direto em um arquivo texto (melhor perder espaço em disco do que acabar com a memória do servidor, rs...).

Apesar da minha precaução, o script Perl consumia toda a memória no servidor. Pesquisando um pouco descobri que o driver DBD::mysql utilizando pelo DBI, por padrão, carrega todos os dados na memória ao chamarmos o método $sth->execute (mysql_store_result). Para evitar isso, devemos habilitar o método mysql_use_result, que lê os dados um a um do banco de dados ao utilizarmos o método fetchrow_array :

my $sth = $dbh->prepare($sql);
$sth->{"mysql_use_result"} = 1;
$sth->execute;

Com isso, meu script não consumia nem 1% da memória do servidor.

OBS: Não esqueça de utilizar o método $sth->finnish antes de fazer outra requisição ao banco de dados.

0 comentários:

Postar um comentário