[Dbix-class] trying to figure out why DBIc query is slow
Frank Sheiness
frank at korcett.com
Wed Nov 7 22:19:21 GMT 2012
I have two postgres queries that return the same data set. One has some
hard coded values, the other uses some joins to figure out which rows to
get. Both queries run very quickly via the psql client and a DBI script.
Using DBIc, the latter query runs very slowly. I've tried using
HashReinflator but it's still very slow. Here are the two queries:
### FAST - about 0.2 seconds for catalyst request to complete
my $bandwidth =3D $c->model('Intermapper::Datasample')->search(
{
'me.dataset_id' =3D> 3165,
'myself.dataset_id' =3D> 3166,
-and =3D> [
'me.sample_time' =3D> {'>=3D' =3D> $from},
'me.sample_time' =3D> {'<=3D' =3D> $to},
'myself.sample_time' =3D> {'>=3D' =3D> $from},
'myself.sample_time' =3D> {'<=3D' =3D> $to},
],
},
{
join =3D> 'myself',
'+select' =3D> qw(myself.sample_mean),
'+as' =3D> qw(down_mean),
order_by =3D> 'me.sample_time'
}
);
Generates SQL:
SELECT me.dataset_id, me.sample_time, me.sample_mean, me.sample_stdv,
me.sample_min, me.sample_max, me.sample_size, myself.sample_mean FROM
datasample me JOIN datasample myself ON myself.sample_time =3D
me.sample_time WHERE ( ( ( me.sample_time >=3D ? AND me.sample_time <=3D ? =
AND
myself.sample_time >=3D ? AND myself.sample_time <=3D ? ) AND me.dataset_id=
=3D ?
AND myself.dataset_id =3D ? ) ) ORDER BY me.sample_time: '2012-10-01',
'2012-11-06 23:59', '2012-10-01', '2012-11-06 23:59', '3165', '3166'
### SLOW - about 13 seconds for catalyst request to complete
my $bandwidth =3D $c->model('Intermapper::Datasample')->search(
{
'dataset.device_id' =3D> $server->intermapper,
'dataset_2.device_id' =3D> $server->intermapper,
'dataset.name' =3D> 'BytT',
'dataset_2.name' =3D> 'BytR',
'dataset.label' =3D> {'-like' =3D> '%[1]%'},
'dataset_2.label' =3D> {'-like' =3D> '%[1]%'},
-and =3D> [
'me.sample_time' =3D> {'>=3D' =3D> $from},
'me.sample_time' =3D> {'<=3D' =3D> $to},
'myself.sample_time' =3D> {'>=3D' =3D> $from},
'myself.sample_time' =3D> {'<=3D' =3D> $to},
],
},
{
join =3D> ['dataset', {myself =3D> 'dataset'}],
'+select' =3D> qw(myself.sample_mean),
'+as' =3D> qw(down_mean),
order_by =3D> 'me.sample_time'
}
);
Generates SQL:
SELECT me.dataset_id, me.sample_time, me.sample_mean, me.sample_stdv,
me.sample_min, me.sample_max, me.sample_size, myself.sample_mean FROM
datasample me JOIN dataset dataset ON dataset.dataset_id =3D me.dataset_id
JOIN datasample myself ON myself.sample_time =3D me.sample_time JOIN datas=
et
dataset_2 ON dataset_2.dataset_id =3D myself.dataset_id WHERE ( ( (
me.sample_time >=3D ? AND me.sample_time <=3D ? AND myself.sample_time >=3D=
? AND
myself.sample_time <=3D ? ) AND dataset.device_id =3D ? AND dataset.label L=
IKE
? AND dataset.name =3D ? AND dataset_2.device_id =3D ? AND dataset_2.label =
LIKE
? AND dataset_2.name =3D ? ) ) ORDER BY me.sample_time: '2012-10-01',
'2012-11-07 23:59', '2012-10-01', '2012-11-07 23:59', '659', '%[1]%',
'BytT', '659', '%[1]%', 'BytR'
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.scsys.co.uk/pipermail/dbix-class/attachments/20121107/58b=
6eb37/attachment.htm
More information about the DBIx-Class
mailing list