CDBIとDBICのsearchメソッド比較
Class::DBIのsearchは実際には、search自体が何かのクラスのメソッドではなく、
Class::DBI::add_searcherメソッドで動的に作られているメソッド(クロージャ)だた。
Class::DBI::add_searcherメソッドにsearchとClass::DBI::Search::Basicが
パラメータで渡されて、
*{"$self\::$name"} = sub {
$class->new(@_)->run_search;
};
と、クロージャが作られてると。
Class::DBI::Search::Basic::run_searchメソッドでは、
sth_to_objectsメソッドを実行してる。
sth_to_objectsメソッドでは、$sth->{Active}がunlessの場合、
$sth->execute(@$args)を実行。
$sth->fetchをwhileでまわして、問答無用で全カラム情報を取得。
取得したカラム情報を_ids_to_objectsメソッドに渡してると。
DBIx::Classとの大きな違いは、
$sth->fetchで一気に全情報を取ってる所ですね。
大量データのあるテーブルを検索した場合はテラヤバス。
Class::DBI::Sweetのsearchメソッドは、結局、sth_to_objectsメソッドを使ってる。
まあ、キャッシュを使って効率化は図ってるみたいですが。
前にDBICのsearchメソッド実行の流れを書きましたが、
CDBIではこんなの
searchメソッド実行
↓ ↓
初回の場合 2回目以降の場合
↓ ↓
executeを実行 ↓
↓ ↓
fetchで全情報を取得
↓
nextメソッドを実行
↓
1データ取得
こんなんですた。
(追記)
このアタリにつてはkatoさんのサイトも要チェック!!
http://www.lost-season.jp/mt/2005/11/2005112322.html
(さらに追記)
DBICのsvnリポジトリ
http://dev.catalyst.perl.org/repos/bast/trunk/DBIx-Class/