Don't use a prepared statement for the active build steps query

Prepared statements are sometimes much slower than unprepared
statements, because the planner doesn't have access to the query
parameters.  This is the case for the active build steps query (in
/status), where a prepared statement is three orders of magnitude
slower.  So disable the use of prepared statements in this case.

(Since the query parameters are constant here, it would be nicer if we
could tell DBIx::Class to prepare a statement with those parameters
fixed.  But I don't know an easy way to do so.)
This commit is contained in:
Eelco Dolstra
2012-03-06 00:20:06 +01:00
parent 68a867da67
commit 8d65ab6158
4 changed files with 15 additions and 7 deletions

View File

@ -95,11 +95,15 @@ sub timeline :Local {
sub status :Local {
my ($self, $c) = @_;
$c->stash->{steps} = [ $c->model('DB::BuildSteps')->search(
{ 'me.busy' => 1, 'build.busy' => 1 },
{ join => [ 'build' ]
, order_by => [ 'machine' ]
} ) ];
$c->model('DB')->storage->dbh_do(sub {
my (undef, $dbh) = @_;
local $dbh->{pg_server_prepare} = 0;
$c->stash->{steps} = [ $c->model('DB::BuildSteps')->search(
{ 'me.busy' => 1, 'build.finished' => 0, 'build.busy' => 1 },
{ join => [ 'build' ]
, order_by => [ 'machine' ]
} ) ];
});
}