WHERE with ORDER not using the best index

From: jugnooken <ken(at)jugnoo(dot)com>
To: pgsql-performance(at)postgresql(dot)org
Subject: WHERE with ORDER not using the best index
Date: 2014-01-29 21:19:17
Message-ID: 1391030357379-5789581.post@n5.nabble.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-performance

Hello everyone,

I've a query that runs on a table with a matching index to its WHERE and
ORDER clause. However the planner never uses that index. Is there any reason
why it doesn't?

Here's the table:

db=> \d social_feed_feed_items;
Table
"public.social_feed_feed_items"
Column | Type |
Modifiers
-------------------+-----------------------------+---------------------------------------------------------------------
id | integer | not null default
nextval('social_feed_feed_items_id_seq'::regclass)
social_feed_id | integer |
social_message_id | integer |
posted_at | timestamp without time zone |
Indexes:
"social_message_feed_feed_items_pkey" PRIMARY KEY, btree (id)
"index_social_feed_feed_items_on_social_feed_id" btree (social_feed_id)
"index_social_feed_feed_items_on_social_feed_id_and_posted_at" btree
(social_feed_id, posted_at DESC NULLS LAST)
"index_social_feed_feed_items_on_social_message_id" btree
(social_message_id)
"social_feed_item_feed_message_index" btree (social_feed_id,
social_message_id)

Here's the query:

db=> EXPLAIN ANALYSE SELECT social_feed_feed_items.social_message_id FROM
social_feed_feed_items WHERE social_feed_feed_items.social_feed_id = 480
ORDER BY posted_at DESC NULLS LAST LIMIT 1200;

QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Limit (cost=126.83..127.43 rows=1200 width=12) (actual time=10.321..13.694
rows=1200 loops=1)
-> Sort (cost=126.83..129.08 rows=4498 width=12) (actual
time=10.318..11.485 rows=1200 loops=1)
Sort Key: posted_at
Sort Method: top-N heapsort Memory: 153kB
-> Index Scan using index_social_feed_feed_items_on_social_feed_id
on social_feed_feed_items (cost=0.09..76.33 rows=4498 width=12) (actual
time=0.037..5.317 rows=4249 loops=1)
Index Cond: (social_feed_id = 480)
Total runtime: 14.913 ms
(7 rows)

I was hoping that they planner would use
index_social_feed_feed_items_on_social_feed_id_and_posted_at, but it never
does. If I manually remove the index that it currently uses then magic
happens:

db=> DROP INDEX index_social_feed_feed_items_on_social_feed_id;
DROP INDEX
db=> EXPLAIN ANALYSE SELECT social_feed_feed_items.social_message_id FROM
social_feed_feed_items WHERE social_feed_feed_items.social_feed_id = 480
ORDER BY posted_at DESC NULLS LAST LIMIT 1200;

QUERY PLAN
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Limit (cost=0.09..998.63 rows=1200 width=12) (actual time=0.027..3.792
rows=1200 loops=1)
-> Index Scan using
index_social_feed_feed_items_on_social_feed_id_and_posted_at on
social_feed_feed_items (cost=0.09..3742.95 rows=4498 width=12) (actual
time=0.023..1.536 rows=1200 loops=1)
Index Cond: (social_feed_id = 480)
Total runtime: 4.966 ms
(4 rows)

So my question is, without dropping
index_social_feed_feed_items_on_social_feed_id since it's needed by other
queries, how do I make the planner use
index_social_feed_feed_items_on_social_feed_id_and_posted_at for a much
faster performance? Why didn't the query look at the matching WHERE and
ORDER clause and only chose the WHERE to begin its plan?

db=> show SERVER_VERSION;
server_version
----------------
9.3.2
(1 row)

Thank you very much for your response(s).

Regards,
Ken

--
View this message in context: http://postgresql.1045698.n5.nabble.com/WHERE-with-ORDER-not-using-the-best-index-tp5789581.html
Sent from the PostgreSQL - performance mailing list archive at Nabble.com.

Responses

Browse pgsql-performance by date

  From Date Subject
Next Message Tom Lane 2014-01-29 22:03:16 Re: Select hangs and there are lots of files in table and index directories.
Previous Message Peter Blair 2014-01-29 19:12:33 Re: Select hangs and there are lots of files in table and index directories.