Class::DBIのTips
Class::DBIのTips
Perlでのパフォーマンス計測は気になりますので、何かいい方法があれば知りたいです。普段はabとかwget -rとかDProfでお茶を濁してますが、上手い方法だとは思えないし。
それはそれとして。
Class::DBIを使うときは
$class->columns(Essential => @cols);
を明示的に設定しておきましょう。
Class::DBIのドキュメントではcolumnsにAllを設定すれば*1Essentialに設定されることになっていますが、標準だとPrimaryのカラムしか返しません。
なので、Primary以外のカラムにアクセスすると余計なqueryを投げることになります。
これを避けるためには、
$class->columns(Essential => $class->all_columns);
とかしておいたほうがいでしょう*2。
常に全部のカラムを読み出していいのなら、
$class->set_sql(Retrieve => <<''); SELECT * FROM __TABLE__ WHERE %s
としておくのも手です*3。
Class::DBI::ColumnsGroupのバグ?
sub add_group { my ($self, $group, @names) = @_; $self->add_group(Primary => $names[0]) if ($group eq "All" or $group eq "Essential") and not $self->group_cols('Primary'); $self->add_group(Essential => @names) if $group eq "All" and !$self->essential; @names = unique($self->primary, @names) if $group eq "Essential"; my @cols = map $self->add_column($_), @names; $_->add_group($group) foreach @cols; $self->{_groups}->{$group} = \@cols; return $self; }
となってるので、Allで設定すればEssentialにも設定されそうですが、肝心のessentialが
sub essential { my $self = shift; my @cols = $self->group_cols('Essential'); @cols = $self->primary unless @cols; return @cols; }
となっていてprimaryを返しちゃうため、結果的に
$self->add_group(Essential => @names) if $group eq "All" and !$self->essential;
が成り立つことはないんですね……。
ここは
$self->add_group(Essential => @names) if $group eq "All" and !$self->group_cols('Essential');
にすべきじゃないのかな?