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
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 |