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
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 |