| 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: | Whole Thread | Raw Message | 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
| 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 |