Re: suggestion to improve planer - Mailing list pgsql-hackers

From Ľubomír Varga
Subject Re: suggestion to improve planer
Date
Msg-id 200909091934.49646.luvar@plaintext.sk
Whole thread Raw
In response to Re: suggestion to improve planer  (Peter Eisentraut <peter_e@gmx.net>)
List pgsql-hackers
On Wednesday 09 September 2009 14:11:41 Peter Eisentraut wrote:
> On Thu, 2009-09-03 at 10:35 +0200, Ľubomír Varga wrote:
> > Hi.
> >
> > I hope, that this is right mailing list.
> >
> > SELECT date, value FROM t_event
> >     WHERE t_event.id in (SELECT id FROM t_event
> >         WHERE date < '2009-08-25'
> >         ORDER BY date DESC LIMIT 1)
> >     ORDER BY date;
> > cost 6.4
> >
> > SELECT date, value FROM t_event
> >     WHERE t_event.id = (SELECT id FROM t_event
> >         WHERE date < '2009-08-25'
> >         ORDER BY date DESC LIMIT 1)
> >     ORDER BY date;
> > cost 6.36..6.37
> >
> >
> > Why that two query dont have equal cost? If it is not problem, try add
> > some planer code to recognize that sublesect HAVE TO return just one row
> > (limit 1) and in plan could be used filter/index scan instead of hash
> > aggregate.
>
> Well, there is always a tradeoff between more planner analysis and more
> complicated and slow planning.  Seeing that the cost estimates are close
> enough for practical purposes, it doesn't seem worthwhile to fix
> anything here.
>
> >  I have
> > also some complex query examples where cost difference is more visible.
>
> Having real examples where a change might actually improve runtime is
> always more interesting than an academic exercise like the above.

Oka, real world example is attached as txt file. There are 3x2 queries and its
costs on my system/database. System/database is also real, and production.
First set for short time interval and second for long time interval.

Main poblem is, that I want to generate some statistical report and I dont
know for how many "devices" Iam going to generate it for. So if I make some
program, there will be something like:
..."t_device.imei in (" + this.getDevicesImeis() + ")"...
If i have only one device, there could be "=" instead of "in".

PS: Iam very confused about actual costs. I dont have exact query on which I
have seen that "in" for one device in array, is much worse than "=" for one
device. Actual costs are somehow different and "=" select gives about ten
time worse cost.

So probably just ignore my mail and keep planner as is.
My version of postgre: "PostgreSQL 8.2.6 on x86_64-pc-linux-gnu, compiled by
GCC x86_64-pc-linux-gnu-gcc (GCC) 4.1.1 (Gentoo 4.1.1-r3)"

--
Odborník na všetko je zlý odborník. Ja sa snažím byť výnimkou potvrdzujúcou
pravidlo.
explain
SELECT spz_number, date, value FROM t_event, t_device_cache, t_device device    WHERE event_type_fk = (SELECT id FROM
t_event_typeWHERE type = 10 LIMIT 1) AND    device.imei = (SELECT imei FROM t_device WHERE id = 3 limit 1) AND
device.id= t_event.device_fk AND    t_device_cache.imei = device.imei AND    date between '2009-08-25' AND
'2009-08-27'UNIONSELECTspz_number, date, value FROM t_event, t_device_cache, t_device device    WHERE event_type_fk =
(SELECTid FROM t_event_type WHERE type = 10 LIMIT 1) AND    device.imei = (SELECT imei FROM t_device WHERE id = 3 limit
1)AND    device.id = t_event.device_fk AND    t_device_cache.imei = device.imei AND    t_event.id = (SELECT id FROM
t_event       WHERE date > '2009-08-27' AND        event_type_fk = (SELECT id FROM t_event_type WHERE type = 10 LIMIT
1)AND        t_event.device_fk = device.id        ORDER BY date ASC LIMIT 1)ORDER BY spz_number, date;
 
cost 2573



explain
SELECT spz_number, date, value FROM t_event, t_device_cache, t_device device    WHERE event_type_fk in (SELECT id FROM
t_event_typeWHERE type = 10 LIMIT 1) AND    device.imei in (SELECT imei FROM t_device WHERE id = 3 limit 1) AND
device.id= t_event.device_fk AND    t_device_cache.imei = device.imei AND    date between '2009-08-25' AND
'2009-08-27'UNIONSELECTspz_number, date, value FROM t_event, t_device_cache, t_device device    WHERE event_type_fk in
(SELECTid FROM t_event_type WHERE type = 10 LIMIT 1) AND    device.imei in (SELECT imei FROM t_device WHERE id = 3
limit1) AND    device.id = t_event.device_fk AND    t_device_cache.imei = device.imei AND    t_event.id = (SELECT id
FROMt_event        WHERE date > '2009-08-27' AND        event_type_fk in (SELECT id FROM t_event_type WHERE type = 10
LIMIT1) AND        t_event.device_fk = device.id        ORDER BY date ASC LIMIT 1)ORDER BY spz_number, date;
 
cost 2109



explain
SELECT spz_number, date, value FROM t_event, t_device_cache, t_device device    WHERE event_type_fk = (SELECT id FROM
t_event_typeWHERE type = 10 LIMIT 1) AND    device.imei in (SELECT imei FROM t_device WHERE id = 3 limit 1) AND
device.id= t_event.device_fk AND    t_device_cache.imei = device.imei AND    date between '2009-08-25' AND
'2009-08-27'UNIONSELECTspz_number, date, value FROM t_event, t_device_cache, t_device device    WHERE event_type_fk =
(SELECTid FROM t_event_type WHERE type = 10 LIMIT 1) AND    device.imei in (SELECT imei FROM t_device WHERE id = 3
limit1) AND    device.id = t_event.device_fk AND    t_device_cache.imei = device.imei AND    t_event.id = (SELECT id
FROMt_event        WHERE date > '2009-08-27' AND        event_type_fk = (SELECT id FROM t_event_type WHERE type = 10
LIMIT1) AND        t_event.device_fk = device.id        ORDER BY date ASC LIMIT 1)ORDER BY spz_number, date;
 
cost 2039


---------------------------------------------------------------------------------------
Extendet time interval:
explain
SELECT spz_number, date, value FROM t_event, t_device_cache, t_device device    WHERE event_type_fk = (SELECT id FROM
t_event_typeWHERE type = 10 LIMIT 1) AND    device.imei = (SELECT imei FROM t_device WHERE id = 3 limit 1) AND
device.id= t_event.device_fk AND    t_device_cache.imei = device.imei AND    date between '2009-08-25' AND
'2009-08-27'UNIONSELECTspz_number, date, value FROM t_event, t_device_cache, t_device device    WHERE event_type_fk =
(SELECTid FROM t_event_type WHERE type = 10 LIMIT 1) AND    device.imei = (SELECT imei FROM t_device WHERE id = 3 limit
1)AND    device.id = t_event.device_fk AND    t_device_cache.imei = device.imei AND    t_event.id = (SELECT id FROM
t_event       WHERE date > '2009-08-27' AND        event_type_fk = (SELECT id FROM t_event_type WHERE type = 10 LIMIT
1)AND        t_event.device_fk = device.id        ORDER BY date ASC LIMIT 1)ORDER BY spz_number, date;
 
cost 32614



explain
SELECT spz_number, date, value FROM t_event, t_device_cache, t_device device    WHERE event_type_fk in (SELECT id FROM
t_event_typeWHERE type = 10 LIMIT 1) AND    device.imei in (SELECT imei FROM t_device WHERE id = 3 limit 1) AND
device.id= t_event.device_fk AND    t_device_cache.imei = device.imei AND    date between '2009-08-25' AND
'2009-08-27'UNIONSELECTspz_number, date, value FROM t_event, t_device_cache, t_device device    WHERE event_type_fk in
(SELECTid FROM t_event_type WHERE type = 10 LIMIT 1) AND    device.imei in (SELECT imei FROM t_device WHERE id = 3
limit1) AND    device.id = t_event.device_fk AND    t_device_cache.imei = device.imei AND    t_event.id = (SELECT id
FROMt_event        WHERE date > '2009-08-27' AND        event_type_fk in (SELECT id FROM t_event_type WHERE type = 10
LIMIT1) AND        t_event.device_fk = device.id        ORDER BY date ASC LIMIT 1)ORDER BY spz_number, date;
 
cost 2711

explain
SELECT spz_number, date, value FROM t_event, t_device_cache, t_device device    WHERE event_type_fk = (SELECT id FROM
t_event_typeWHERE type = 10 LIMIT 1) AND    device.imei in (SELECT imei FROM t_device WHERE id = 34 limit 1) AND
device.id= t_event.device_fk AND    t_device_cache.imei = device.imei AND    date between '2009-07-25' AND
'2009-08-25'UNIONSELECTspz_number, date, value FROM t_event, t_device_cache, t_device device    WHERE event_type_fk =
(SELECTid FROM t_event_type WHERE type = 10 LIMIT 1) AND    device.imei in (SELECT imei FROM t_device WHERE id = 34
limit1) AND    device.id = t_event.device_fk AND    t_device_cache.imei = device.imei AND    t_event.id = (SELECT id
FROMt_event        WHERE date > '2009-08-25' AND        event_type_fk = (SELECT id FROM t_event_type WHERE type = 10
LIMIT1) AND        t_event.device_fk = device.id        ORDER BY date ASC LIMIT 1)ORDER BY spz_number, date;
 
cost 2732

pgsql-hackers by date:

Previous
From: Tom Lane
Date:
Subject: Re: Ragged CSV import
Next
From: Alvaro Herrera
Date:
Subject: Re: Ragged CSV import