Actually what finally sovled the problem is repeating the 
dtstamp > last_viewed
in the sub select

select articlenumber, channel, description, title, link, dtstamp  from items i1, 
my_channels where ((i1.channel = '22222' and
my_channels.id = '22222' and owner = 'drormata'  and (dtstamp > last_viewed)) ) and 
(dtstamp = (select max (dtstamp) from items i2 
        where channel = '22222' and i1.link = i2.link));

to
explain analyze select articlenumber, channel, description, title, link, dtstamp  from 
items i1, my_channels where ((i1.channel = '22222' and
my_channels.id = '22222' and owner = 'drormata'  and (dtstamp > last_viewed)) ) and 
(dtstamp = (select max (dtstamp) from items i2 where
channel = '22222' and i1.link = i2.link and dtstamp > last_viewed));

Which in the stored procedure looks like this:
CREATE or REPLACE FUNCTION item_max_date (int4, varchar, timestamptz)
RETURNS
timestamptz AS '
select max(dtstamp) from items where channel = $1 and link = $2 and
dtstamp > $3;
' LANGUAGE 'sql';


Basically I have hundreds or thousands of items but only a few that
satisfy "dtstamp > last_viewed". Obviously I want to run the max() only on
on a few items. Repeating "dtstamp > last_viewed" did the trick, but it
seems like there should be a more elegant/clear way to tell the planner
which constraint to apply first.

Dror



On Wed, Oct 08, 2003 at 10:54:24AM -0400, Greg Stark wrote:
> Rod Taylor <[EMAIL PROTECTED]> writes:
> 
> > On Fri, 2003-10-03 at 17:53, Dror Matalon wrote:
> > > On Fri, Oct 03, 2003 at 05:44:49PM -0400, Rod Taylor wrote:
> > > >
> > > > It is too bad the (channel, link) index doesn't have dtstamp at the end
> > > > of it, otherwise the below query would be a gain (might be a small one
> > > > anyway).
> > > > 
> > > >   select dtstamp
> > > >     from items
> > > >    where channel = $1
> > > >      and link = $2
> > > > ORDER BY dtstamp DESC
> > > >    LIMIT 1;
> > 
> > It didn't make a difference even with the 3 term index? I guess you
> > don't have very many common values for channel / link combination.
> 
> You need to do:
> 
>  ORDER BY channel DESC, link DESC, dtstamp DESC
> 
> This is an optimizer nit. It doesn't notice that since it selected on channel
> and link already the remaining tuples in the index will be ordered simply by
> dtstamp.
> 
> (This is the thing i pointed out previously in
> <[EMAIL PROTECTED]> on Feb 13th 2003 on pgsql-general)
> 
> 
> -- 
> greg
> 

-- 
Dror Matalon
Zapatec Inc 
1700 MLK Way
Berkeley, CA 94709
http://www.zapatec.com

---------------------------(end of broadcast)---------------------------
TIP 6: Have you searched our list archives?

               http://archives.postgresql.org

Reply via email to