| 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: | Whole Thread | Raw Message | 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 |