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