Re: [HACKERS] Subqueries and indexes

From: Bruce Momjian <maillist(at)candle(dot)pha(dot)pa(dot)us>
To: maillist(at)candle(dot)pha(dot)pa(dot)us
Cc: vadim(at)krs(dot)ru, hackers(at)postgreSQL(dot)org
Subject: Re: [HACKERS] Subqueries and indexes
Date: 1999-03-17 18:32:28
Message-ID: 199903171832.NAA12274@candle.pha.pa.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

> >
> > All except of subqueries with aggregates in target list.
>
> I am confused. How do I rewrite this to use exists?
>
> SELECT keyname
> FROM markmain
> WHERE mark_id NOT IN(SELECT mark_id
> FROM markaty)
>
>
> Even if I use IN instead of NOT IN, I don't see how to do it without
> making it a correlated subquery.
>
> SELECT keyname
> FROM markmain
> WHERE EXISTS (SELECT mark_id
> FROM markaty
> WHERE markmain.mark_id = markaty.mark_id)
>
> This is a correlated subquery. It did not use hash, but it did use the
> index on markaty:
>
> Seq Scan on markmain (cost=16.02 size=334 width=12)
> SubPlan
> -> Index Scan using i_markaty on markaty (cost=2.10 size=3 width=4)
>
> While the index usage is good, the fact is the subquery is executed for
> every row of markmain, isn't it? That's one query executed for each row
> in markmain, isn't it?

I just tried this with NOT EXISTS, and it was VERY fast. Can we discuss
the issues, and perhaps auto-rewrite these as exists. Is that always
better than hash?

--
Bruce Momjian | http://www.op.net/~candle
maillist(at)candle(dot)pha(dot)pa(dot)us | (610) 853-3000
+ If your life is a hard drive, | 830 Blythe Avenue
+ Christ can be your backup. | Drexel Hill, Pennsylvania 19026

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Terry Mackintosh 1999-03-17 19:34:14 Re: [Fwd: Re: [HACKERS] Sequences....]
Previous Message Bruce Momjian 1999-03-17 18:25:30 vacuum slowness