Re: Suboptimal query plan fixed by replacing OR with UNION

From: Jasen Betts <jasen(at)xnet(dot)co(dot)nz>
To: pgsql-general(at)postgresql(dot)org
Subject: Re: Suboptimal query plan fixed by replacing OR with UNION
Date: 2012-07-06 01:35:46
Message-ID: jt5fdi$9us$1@reversiblemaps.ath.cx
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

I note you've decided to rewrite this query as a union

> SELECT * FROM account
> WHERE user_id in
> (SELECT user_id FROM account
> WHERE id = ANY('{00000000-02f6-379d-c000-000000026810,00000000-0320-b467-c000-000000026810,00000000-000d-cefb-c000-000000026810}'))
> OR
> id = ANY('{00000000-02f6-379d-c000-000000026810,00000000-0320-b467-c000-000000026810,00000000-000d-cefb-c000-000000026810}');

I notice both arrays (used with = ANY) have the exact same content,

if this is always true you can use a CTE here for the ID=ANY(...)
query and reference the CTE on both sides of the union.

WITH i as (
SELECT * FROM account WHERE id = ANY('{00000000-02f6-379d-c000-000000026810,00000000-0320-b467-c000-000000026810,00000000-000d-cefb-c000-000000026810}')
)
SELECT
* from i
UNION DISTINCT
SELECT
account.* from account join i on i.user_id = account.userid ;

--
⚂⚃ 100% natural

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Greg Smith 2012-07-06 01:42:19 Re: The need for clustered indexes to boost TPC-V performance
Previous Message Craig Ringer 2012-07-06 01:04:20 Re: The need for clustered indexes to boost TPC-V performance