Disable prepared statements completely
Because of the way DBIx::Class does prepared statements, even innocuous queries such $c->model('DB::Builds)->search({finished => 0}) can be extremely slow. This is because DBIx::Class prepares a PostgreSQL statement select ... from Builds where finished = ? and since Builds is very large and there is a large fraction of rows with "finished = 1", the PostgreSQL query planner decides to implement this query with a sequential scan of the Builds table (despite the existence of an index on "finished"), which is extremely slow. It would be nice if we could tell DBIx::Class that constants should be part of the prepared statement, i.e. select ... from Builds where finished = 0 but AFAIK we can't.
This commit is contained in:
parent
2d1cf73974
commit
abe71a767b
|
@ -95,15 +95,11 @@ sub timeline :Local {
|
||||||
|
|
||||||
sub status :Local {
|
sub status :Local {
|
||||||
my ($self, $c) = @_;
|
my ($self, $c) = @_;
|
||||||
$c->model('DB')->storage->dbh_do(sub {
|
|
||||||
my (undef, $dbh) = @_;
|
|
||||||
local $dbh->{pg_server_prepare} = 0;
|
|
||||||
$c->stash->{steps} = [ $c->model('DB::BuildSteps')->search(
|
$c->stash->{steps} = [ $c->model('DB::BuildSteps')->search(
|
||||||
{ 'me.busy' => 1, 'build.finished' => 0, 'build.busy' => 1 },
|
{ 'me.busy' => 1, 'build.finished' => 0, 'build.busy' => 1 },
|
||||||
{ join => [ 'build' ]
|
{ join => [ 'build' ]
|
||||||
, order_by => [ 'machine' ]
|
, order_by => [ 'machine' ]
|
||||||
} ) ];
|
} ) ];
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,10 @@ use Hydra::Helper::Nix;
|
||||||
|
|
||||||
__PACKAGE__->config(
|
__PACKAGE__->config(
|
||||||
schema_class => 'Hydra::Schema',
|
schema_class => 'Hydra::Schema',
|
||||||
connect_info => [getHydraDBPath],
|
connect_info => {
|
||||||
|
dsn => getHydraDBPath,
|
||||||
|
pg_server_prepare => 0,
|
||||||
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
=head1 NAME
|
=head1 NAME
|
||||||
|
|
Loading…
Reference in a new issue