Re: Trying to eliminate union and sort

From: Vitalii Tymchyshyn <tivv00(at)gmail(dot)com>
To: Brian Fehrle <brianf(at)consistentstate(dot)com>
Cc: pgsql-performance(at)postgresql(dot)org
Subject: Re: Trying to eliminate union and sort
Date: 2013-07-17 08:24:40
Message-ID: CABWW-d0rS9rWYOw+4y-vMWjTj=_M8aBrJjcRJ3cCKdasQGZw=A@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-performance

I'd try to check why discounts are different. Join with 'or' should work.
Build (one query) except all (another query) and check some rows from
result.
13 лип. 2013 01:28, "Brian Fehrle" <brianf(at)consistentstate(dot)com> напис.

> On 07/11/2013 06:46 PM, Josh Berkus wrote:
>
>> Brian,
>>
>> 3. I'm trying to eliminate the union, however I have two problems.
>>> A) I can't figure out how to have an 'or' clause in a single join that
>>> would fetch all the correct rows. If I just do:
>>> LEFT OUTER JOIN table2 t2 ON (t2.real_id = t.id OR t2.real_id =
>>> t.backup_id), I end up with many less rows than the original query. B.
>>>
>>> I believe the issue with this is a row could have one of three
>>> possibilities:
>>> * part of the first query but not the second -> results in 1 row after
>>> the union
>>> * part of the second query but not the first -> results in 1 row after
>>> the union
>>> * part of the first query and the second -> results in 2 rows after the
>>> union (see 'B)' for why)
>>>
>>> B) the third and fourth column in the SELECT will need to be different
>>> depending on what column the row is joined on in the LEFT OUTER JOIN to
>>> table2, so I may need some expensive case when logic to filter what is
>>> put there based on whether that row came from the first join clause, or
>>> the second.
>>>
>> No, it doesn't:
>>
>> SELECT t.id,
>> t.mycolumn1,
>> table3.otherid as otherid1,
>> table3a.otherid as otherid2,
>> t.mycolumn2
>> FROM t
>> LEFT OUTER JOIN table2
>> ON ( t.id = t2.real_id OR t.backup_id = t2.real_id )
>> LEFT OUTER JOIN table3
>> ON ( t.typeid = table3.id )
>> LEFT OUTER JOIN table3 as table3a
>> ON ( table2.third_id = table3.id )
>> WHERE t.external_id IN ( ... )
>> ORDER BY t.mycolumn2, t.id
>>
> I tried this originally, however my resulting rowcount is different.
>
> The original query returns 9,955,729 rows
> This above one returns 7,213,906
>
> As for the counts on the tables:
> table1 3,653,472
> table2 2,191,314
> table3 25,676,589
>
> I think it's safe to assume right now that any resulting joins are not
> one-to-one
>
> - Brian F
>
>
>
>
> --
> Sent via pgsql-performance mailing list (pgsql-performance(at)postgresql(dot)**
> org <pgsql-performance(at)postgresql(dot)org>)
> To make changes to your subscription:
> http://www.postgresql.org/**mailpref/pgsql-performance<http://www.postgresql.org/mailpref/pgsql-performance>
>

In response to

Browse pgsql-performance by date

  From Date Subject
Next Message Vasilis Ventirozos 2013-07-17 09:28:50 Re: Distributed transactions and asynchronous commit
Previous Message Xenofon Papadopoulos 2013-07-17 07:18:34 Distributed transactions and asynchronous commit