[Dbix-class] Why is this so slow?
Chris Cole
chris at compbio.dundee.ac.uk
Tue Jun 8 13:09:20 GMT 2010
Given the schema provided at the end, why is this code so slow?
sub getCounts ($) {
my $self = shift;
my $dataset = shift;
croak "ERROR - dataset name is required\n" unless ($dataset);
my $nHits;
# make SQL search both technical replicates at the same time
$dataset =~ s/t\d/t%/;
my $rs = $self->resultset('NgsMappings')->search(
{
'me_sample' => {'like', $dataset},
},
{
columns => [qw/mp_strand mp_ref_id.rs_name mp_start mp_end
mp_freq/],
join => [qw/mp_me_id mp_ref_id/],
}
);
while (my $hit = $rs->next()) {
my $freq = $hit->get_column('mp_freq');
$nHits += $freq;
}
return($nHits);
}
The equivalent SQL via DBI runs in ~1.5 min, but the above I killed
after 30min. The DBI code is:
my $sth = $dbh->prepare("SELECT mp_strand,rs_name,mp_start,mp_end,mp_freq
FROM ngs_mappings
JOIN ngs_map_exps on mp_me_id = me_id
JOIN ngs_ref_seqs on mp_ref_id = rs_id
WHERE me_sample like ?
") or die "ERROR - prepare() statement
failed: ", $dbh->errstr();
$sth->execute($sample) or die "ERROR - execute() statement failed: ",
$dbh->errstr;
while (my $row = $sth->fetchrow_arrayref()) {
$nHits += $row->[4];
}
$sth->finish();
Any pointers appreciated.
Cheers,
Chris
SCHEMATA
package DB::Schema::NgsMappings;
use strict;
use warnings;
use base 'DBIx::Class';
__PACKAGE__->load_components("Core");
__PACKAGE__->table("ngs_mappings");
__PACKAGE__->add_columns(
"mp_me_id",
{ data_type => "NUMBER", default_value => undef, is_nullable => 0,
size => 38 },
"mp_seq_id",
{ data_type => "NUMBER", default_value => undef, is_nullable => 0,
size => 38 },
"mp_ref_id",
{ data_type => "NUMBER", default_value => undef, is_nullable => 0,
size => 38 },
"mp_strand",
{ data_type => "NUMBER", default_value => undef, is_nullable => 0,
size => 38 },
"mp_start",
{ data_type => "NUMBER", default_value => undef, is_nullable => 0,
size => 38 },
"mp_end",
{ data_type => "NUMBER", default_value => undef, is_nullable => 0,
size => 38 },
"mp_cigar",
{
data_type => "VARCHAR2",
default_value => undef,
is_nullable => 1,
size => 255,
},
"mp_score",
{ data_type => "NUMBER", default_value => undef, is_nullable => 1,
size => 38 },
"mp_rank",
{ data_type => "NUMBER", default_value => undef, is_nullable => 1,
size => 38 },
"mp_freq",
{ data_type => "NUMBER", default_value => undef, is_nullable => 1,
size => 38 },
);
__PACKAGE__->set_primary_key(
"mp_me_id",
"mp_seq_id",
"mp_ref_id",
"mp_strand",
"mp_start",
"mp_end",
);
__PACKAGE__->belongs_to("mp_seq_id", "DB::Schema::NgsSeqs", { sq_id =>
"mp_seq_id" });
__PACKAGE__->belongs_to(
"mp_ref_id",
"DB::Schema::NgsRefSeqs",
{ rs_id => "mp_ref_id" },
);
__PACKAGE__->belongs_to("mp_me_id", "DB::Schema::NgsMapExps", { me_id =>
"mp_me_id" });
package DB::Schema::NgsMapExps;
use strict;
use warnings;
use base 'DBIx::Class';
__PACKAGE__->load_components("Core");
__PACKAGE__->table("ngs_map_exps");
__PACKAGE__->add_columns(
"me_id",
{ data_type => "NUMBER", default_value => undef, is_nullable => 0,
size => 38 },
"me_exp_id",
{ data_type => "NUMBER", default_value => undef, is_nullable => 1,
size => 38 },
"me_sample",
{
data_type => "VARCHAR2",
default_value => undef,
is_nullable => 1,
size => 255,
},
"me_description",
{
data_type => "VARCHAR2",
default_value => undef,
is_nullable => 0,
size => 255,
},
"me_program",
{
data_type => "VARCHAR2",
default_value => undef,
is_nullable => 1,
size => 255,
},
"me_version",
{
data_type => "VARCHAR2",
default_value => undef,
is_nullable => 1,
size => 255,
},
"me_arguments",
{
data_type => "VARCHAR2",
default_value => undef,
is_nullable => 1,
size => 1000,
},
"me_ref_db_id",
{ data_type => "NUMBER", default_value => undef, is_nullable => 1,
size => 38 },
);
__PACKAGE__->set_primary_key("me_id");
__PACKAGE__->has_many(
"ngs_mappings",
"DB::Schema::NgsMappings",
{ "foreign.mp_me_id" => "self.me_id" },
);
__PACKAGE__->belongs_to(
"me_ref_db_id",
"DB::Schema::NgsRefDb",
{ db_id => "me_ref_db_id" },
);
package DB::Schema::NgsRefSeqs;
use strict;
use warnings;
use base 'DBIx::Class';
__PACKAGE__->load_components("Core");
__PACKAGE__->table("ngs_ref_seqs");
__PACKAGE__->add_columns(
"rs_id",
{ data_type => "NUMBER", default_value => undef, is_nullable => 0,
size => 38 },
"rs_db_id",
{ data_type => "NUMBER", default_value => undef, is_nullable => 1,
size => 38 },
"rs_sq_len",
{ data_type => "NUMBER", default_value => undef, is_nullable => 1,
size => 38 },
"rs_type",
{
data_type => "VARCHAR2",
default_value => undef,
is_nullable => 1,
size => 255,
},
"rs_name",
{
data_type => "VARCHAR2",
default_value => undef,
is_nullable => 1,
size => 255,
},
"rs_alt_name",
{
data_type => "VARCHAR2",
default_value => undef,
is_nullable => 1,
size => 255,
},
"rs_sq_no",
{ data_type => "NUMBER", default_value => undef, is_nullable => 1,
size => 38 },
);
__PACKAGE__->set_primary_key("rs_id");
__PACKAGE__->has_many(
"ngs_mappings",
"DB::Schema::NgsMappings",
{ "foreign.mp_ref_id" => "self.rs_id" },
);
__PACKAGE__->belongs_to("rs_db_id", "DB::Schema::NgsRefDb", { db_id =>
"rs_db_id" });
More information about the DBIx-Class
mailing list