Thread: Re: [HACKERS] subselect and optimizer

Re: [HACKERS] subselect and optimizer

From
"Igor Sysoev"
Date:
Vadim wrote:
> >
> > I'm using PostgreSQL 6.3.2.
> >
> > As reported in some messages ago PostgreSQL has problem with
> > "... where some_field in (select ..." type subqueries.
> > One of the solutions was to create indecies.
> > I created two indecies for character(9) fields key and newkey:
> > create index key_i on bik (key);
> > create index newkey_i on bik (newkey);
> > run two quiery explain:
> >
> > bik=>explain select * from bik where key in (select newkey from
> > bik where bik='044531864');
> > NOTICE:  Apr 21 14:15:41:QUERY PLAN:
> >
> > Seq Scan on bik  (cost=770.92 size=1373 width=113)
> >   SubPlan
> >     ->  Seq Scan on bik  (cost=770.92 size=1 width=12)
>           ^^^
> This is very strange. Index Scan should be used here.
> I'll try to discover this...

No, I think it's not strange - I haven't index for bik (bik) so in both
cases
internal select should using Seq Scan. I repeat EXPLAIN from second query
(You
droped it):

------
bik=> explain select * from bik where key = (select newkey from bik
where bik='044531864');
NOTICE:  Apr 21 14:16:01:QUERY PLAN:

Index Scan on bik  (cost=2.05 size=1 width=113)
  InitPlan
    ->  Seq Scan on bik  (cost=770.92 size=1 width=12)

EXPLAIN
-------

Strange is another - outer select in second query using Index Scan (it's
right)
but it doesn't use it in first query.

> BTW, IN is slow (currently :) - try to create 2-key index on bik (bik,
newkey)
> and rewrite your query as

I tried simple query to check can IN use Index Scan ? EXPLAIN show it can:

--------
bik=> explain select * from bik where key in ('aqQWV+ZG');
NOTICE:  Apr 22 10:29:44:QUERY PLAN:

Index Scan on bik  (cost=2.05 size=1 width=113)

EXPLAIN
--------

> select * from bik b1 where EXISTS (select newkey from bik where
> bik = '....' and b1.key = newkey)

> And let's know... (Note, that index on (newkey, bik) may be more useful
> than on (bik, newkey) - it depends on your data).

Ok, I' will try it now but main problem is that I often need to use LIKE
operator (i.e. bik ~ '31864') in subselect and can't use indecies in this
case.

Igor Sysoev