Re: 2 left joins causes seqscan

From: Kevin Grittner <kgrittn(at)ymail(dot)com>
To: Willy-Bas Loos <willybas(at)gmail(dot)com>, "pgsql-general(at)postgresql(dot)org" <pgsql-general(at)postgresql(dot)org>
Subject: Re: 2 left joins causes seqscan
Date: 2014-09-12 21:11:56
Message-ID: 1410556316.23161.YahooMailNeo@web122302.mail.ne1.yahoo.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

Willy-Bas Loos <willybas(at)gmail(dot)com> wrote:

> As you can see, the second query is far more efficient, even
> though it scans both tables twice to combine the results.

But the two queries don't return the same results. Of course the
second one will be faster. The simple equivalent of your second
query is:

explain analyze select a.field1, b.title
from a
join b on b.id = a.id
where lower(b.title) like 'abcd%'
and lang in (1, 2);

The equivalent of your first query is to take the result sets from
these two queries:

select a1.field1, b1.title, b2.title
from a a1
join b b1 on b1.id = a1.id and b1.lang = 1
left join b b2 on (b2.id = a1.id and b2.lang = 2)
where lower(b1.title) like'abcd%'
union
select a2.field1, b4.title, b3.title
from a a2
join b b3 on b3.id = a2.id and b3.lang = 2
left join b b4 on (b4.id = a2.id and b4.lang = 1)
where lower(b3.title) like'abcd%';

The above form does optimize better than the original, but it's not
too surprising that the planner can't come up with the optimal
plan; you've posed quite a challenge for it.

--
Kevin Grittner
EDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Willy-Bas Loos 2014-09-13 08:10:57 Re: 2 left joins causes seqscan
Previous Message Willy-Bas Loos 2014-09-12 16:19:31 2 left joins causes seqscan