Re: Optimizing `WHERE x IN` query

From: Nicolas Charles <nicolas(dot)charles(at)rudder(dot)io>
To: Thomas Kellerer <spam_eater(at)gmx(dot)net>, pgsql-performance(at)lists(dot)postgresql(dot)org
Subject: Re: Optimizing `WHERE x IN` query
Date: 2019-07-09 15:21:34
Message-ID: 687daa64-4fc4-466d-25ed-1a664c9cdf98@rudder.io
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-performance

Le 07/07/2019 à 16:33, Thomas Kellerer a écrit :
> Omar Roth schrieb am 07.07.2019 um 15:43:
>> Currently, the query I'm using to generate a user's feed is:
>>
>> ```
>> SELECT * FROM channel_videos WHERE ucid IN (SELECT
>> unnest(subscriptions) FROM
>> users WHERE email = $1) ORDER BY published DESC;
>> ```
>
> You could try an EXISTS query without unnest:
>
> select cv.*
> from channel_videos cv
> where exists ucid (select *
>                    from users u
>                    where cv.ucid = any(u.subscriptions)
>                      and u.email = $1);
>
> Did you try if a properly normalized model performs better?
>
>
Hi

We had big performance issues with queries like that, and we modified
them to use && (see
https://www.postgresql.org/docs/current/functions-array.html ),
resulting in a big perf boost

so, with your model, the query could be

```
select cv.*
from channel_videos cv

inner join user u on cv.ucid && u.subscription

where u.email = $1;
```

or

```
select cv.*
from channel_videos cv

inner join ( select subscription  from user where email = $1) as u on
cv.ucid && u.subscription ;

```

(disclaimer, I didn't try this queries, they may contain typos)

Regards

Nicolas

In response to

Responses

Browse pgsql-performance by date

  From Date Subject
Next Message Ancoron Luciferis 2019-07-09 22:08:34 Re: UUID v1 optimizations...
Previous Message Omar Roth 2019-07-09 14:44:37 Re: Optimizing `WHERE x IN` query