Hello Hellmuth,

Thank you for your response.
I've uploaded the query plan for the first query (user_id=2) here: 
https://gist.github.com/anonymous/6d251b277ef71f8977b03cab91fedccdThe query 
plan for the second query (user_id=1) can be found here: 
https://gist.github.com/anonymous/32ed485b40cce2651ddc52661f3e7f7b
Just like in the original queries, posts_user_id_id_index is not used.
Kind regards,Milo
13. Feb 2018 22:13 by hiv...@gmail.com:


> Hello:
>
> EXPLAIN (ANALYZE, BUFFERS)> select * from (>  > SELECT > posts.id> , > 
> users.name> , posts.content>   > FROM posts JOIN users ON posts.user_id = > 
> users.id>  > WHERE posts.user_id IN (SELECT friend_user_id FROM friends WHERE 
> user_id = 1)
>       > ORDER BY > posts.id>  DESC > ) as a> ORDER BY > a.id>  DESC > LIMIT 
> 10;
> ------
>
> EXPLAIN (ANALYZE, BUFFERS)> select * from (>  > SELECT > posts.id> , > 
> users.name> , posts.content>   > FROM posts JOIN users ON posts.user_id = > 
> users.id>  > WHERE posts.user_id IN (SELECT friend_user_id FROM friends WHERE 
> user_id = 2)
>       > ORDER BY > posts.id>  DESC > ) as a> ORDER BY > a.id>  DESC > LIMIT 
> 10;
> 2018-02-13 8:28 GMT-05:00  <> mks...@keemail.me> >:
>
>>           >> Hello,
>> I have the following schema:
>>     CREATE TABLE users (>>         id   BIGSERIAL PRIMARY KEY,>>         
>> name TEXT      NOT NULL UNIQUE>>     );>>     >>     CREATE TABLE friends 
>> (>>         user_id        BIGINT NOT NULL REFERENCES users,>>         
>> friend_user_id BIGINT NOT NULL REFERENCES users,>>         UNIQUE (user_id, 
>> friend_user_id)>>     );>>     >>     CREATE TABLE posts (>>         id      
>> BIGSERIAL PRIMARY KEY,>>         user_id BIGINT    NOT NULL REFERENCES 
>> users,>>         content TEXT      NOT NULL>>     );>>     CREATE INDEX 
>> posts_user_id_id_index ON posts(user_id, id);
>> Each user can unilaterally follow any number of friends. The posts table has 
>> a large number of rows and is rapidly growing.
>> My goal is to retrieve the 10 most recent posts of a user's friends. This 
>> query gives the correct result, but is inefficient:
>>     SELECT >> posts.id>> , >> users.name>> , posts.content>>     FROM posts 
>> JOIN users ON posts.user_id = >> users.id>>     WHERE posts.user_id IN 
>> (SELECT friend_user_id FROM friends WHERE user_id = 1)>>     ORDER BY >> 
>> posts.id>>  DESC LIMIT 10;
>> If the user's friends have recently posted, the query is still reasonably 
>> fast (>> https://explain.depesz.com/s/6ykR>> ). But if the user's friends 
>> haven't recently posted or the user has no friends, it quickly deteriorates 
>> (>> https://explain.depesz.com/s/OnoG>> ).
>> If I match only a single post author (e.g. WHERE posts.user_id = 5), 
>> Postgres uses the index posts_user_id_id_index. But if I use IN, the index 
>> doesn't appear to be used at all.
>> How can I get these results more efficiently?
>> I've uploaded the schema and the queries I've tried to dbfiddle at >> 
>> http://dbfiddle.uk/?rdbms=postgres_9.6&fiddle=cf1489b7f6d53c3fe0b55ed7ccbad1f0>>
>>  . The output of "SELECT version()" is "PostgreSQL 9.6.5 on 
>> x86_64-pc-linux-gnu, compiled by gcc (Debian 4.9.2-10) 4.9.2, 64-bit" for me.
>> Thank you in advance for any insights, pointers or suggestions you are able 
>> to give me.
>> Regards,>> Milo>>   
>
>
>
> -- 
> Cordialmente, 
>
> Ing. Hellmuth I. Vargas S. 
> Esp. Telemática y Negocios por Internet > Oracle Database 10g Administrator 
> Certified Associate
> EnterpriseDB Certified PostgreSQL 9.3 Associate
>

Reply via email to