Re: Intersect/Union X AND/OR

Поиск
Список
Период
Сортировка
От Thiago Godoi
Тема Re: Intersect/Union X AND/OR
Дата
Msg-id CAFQfwCr75AOBBiFePmXuQy32AGmQWUuKWWMSHxnkJ1vprwFmkw@mail.gmail.com
обсуждение исходный текст
Ответ на Re: Intersect/Union X AND/OR  (Merlin Moncure <mmoncure@gmail.com>)
Ответы Re: Intersect/Union X AND/OR  (Bruce Momjian <bruce@momjian.us>)
Re: Intersect/Union X AND/OR  (Marti Raudsepp <marti@juffo.org>)
Список 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@gmail.com>
On Fri, Dec 2, 2011 at 1:49 PM, Bruce Momjian <bruce@momjian.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


 

В списке pgsql-performance по дате отправления:

Предыдущее
От: "Pierre C"
Дата:
Сообщение: Re: unlogged tables
Следующее
От: "Nicholson, Brad (Toronto, ON, CA)"
Дата:
Сообщение: Re: pg_upgrade