DBI ドキュメントでは、クエリを何度も実行するための推奨コードは次のとおりです。
$sth = $dbh->prepare_cached($statement);
$sth->execute(@bind);
$data = $sth->fetchall_arrayref(@attrs);
$sth->finish;
ただし、多くの*クエリメソッドでは、クエリ文字列の代わりに、準備されキャッシュされたステートメントハンドルを渡すことができるため、これが可能になります。
$sth = $dbh->prepare_cached($statement);
$data = $dbh->selectall_arrayref($sth, \%attrs, @bind);
このアプローチに問題はありますか?私はそれが野生で使われているのを見たことがありません。
FWIW、私はこれら 2 つの実装をベンチマークしました。fetchall_arrayref
また、2 番目の方法は、最初の実装と 2 番目の実装を使用して 2 つの連続する行をクエリする場合、わずかに (4%) 高速に見えますselectall_arrayref
。
* これをサポートするクエリ メソッドの完全なリストは次のとおりです。
- selectrow_arrayref - 準備済みステートメントを使用する通常の方法は fetchrow_arrayref です
- selectrow_hashref - " " fetchrow_hashref
- selectall_arrayref - " " fetchall_arrayref
- selectall_hashref - " " fetchall_hashref
- selectcol_arrayref (上記のように最初のコード パスを使用する並列メソッドがないため、実際にはカウントされません。したがって、このメソッドで準備済みステートメントを使用する唯一の方法は、上記の 2 番目のコード パスを使用することです)