From: | Thiago Godoi <thiagogodoi10(at)gmail(dot)com> |
---|---|
To: | Merlin Moncure <mmoncure(at)gmail(dot)com> |
Cc: | Bruce Momjian <bruce(at)momjian(dot)us>, pgsql-performance(at)postgresql(dot)org |
Subject: | Re: Intersect/Union X AND/OR |
Date: | 2011-12-05 12:14:04 |
Message-ID: | CAFQfwCr75AOBBiFePmXuQy32AGmQWUuKWWMSHxnkJ1vprwFmkw@mail.gmail.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-performance |
Thanks for the answers.
I found one of these cases , but I'm trying to understand this. Why the
performance is better? The number of tuples is making the difference?
My original query :
select table1.id
from table1, (select function(12345) id) table2
where table1.kind = 1234
and table1.id = table2.id
"Nested Loop (cost=0.00..6.68 rows=1 width=12)"
" Join Filter: ()"
" -> Seq Scan on recorte (cost=0.00..6.39 rows=1 width=159)"
" Filter: (id = 616)"
" -> Result (cost=0.00..0.26 rows=1 width=0)"
-- function() returns a resultset
I tryed with explicit join and "in" , but the plan is the same.
When I changed the query to use intersect :
(select table1.id from table1 where table1.kind = 1234)
Intersect
(select function(12345) id)
The new plan is :
"HashSetOp Intersect (cost=0.00..6.67 rows=1 width=80)"
" -> Append (cost=0.00..6.67 rows=2 width=80)"
" -> Subquery Scan on "*SELECT* 1" (cost=0.00..6.40 rows=1
width=159)"
" -> Seq Scan on recorte (cost=0.00..6.39 rows=1 width=159)"
" Filter: (id = 616)"
" -> Subquery Scan on "*SELECT* 2" (cost=0.00..0.27 rows=1
width=0)"
" -> Result (cost=0.00..0.26 rows=1 width=0)"
The second plan is about 10 times faster than the first one.
2011/12/2 Merlin Moncure <mmoncure(at)gmail(dot)com>
> On Fri, Dec 2, 2011 at 1:49 PM, Bruce Momjian <bruce(at)momjian(dot)us> wrote:
> > Thiago Godoi wrote:
> >> Hi all,
> >>
> >> I found this presentation from B. Momjian:
> >>
> >> http://momjian.us/main/writings/pgsql/performance.pdf
> >>
> >> I'm interested in what he said about " Intersect/Union X AND/OR " , Can
> I
> >> find a transcription or a video of this presentation? Can anyone
> explain it
> >> to me?
> >
> > Well, there is a recording of the webcast on the EnterpriseDB web site,
> > but I am afraid they only allow viewing of 3+ hour webcasts by
> > EnterpriseDB customers.
> >
> > The idea is that a query that uses an OR can be rewritten as two SELECTs
> > with a UNION between them. I have seen rare cases where this is a win,
> > so I mentioned it in that talk. Intersection is similarly possible for
> > AND in WHERE clauses.
>
> I've seen this as well. Also boolean set EXCEPT is useful as well in
> the occasional oddball case.
>
> merlin
>
--
Thiago Godoi
From | Date | Subject | |
---|---|---|---|
Next Message | Nicholson, Brad (Toronto, ON, CA) | 2011-12-05 13:36:36 | Re: pg_upgrade |
Previous Message | Pierre C | 2011-12-04 12:28:03 | Re: unlogged tables |