Using Postgres 9.4, I'm trying to order a query by an indexed datetime column.
explain
SELECT g.*, array_agg(gp.platform_id) as platform_list,
array_agg(gm.metacritic_id) as metacritic_list,
array_agg(gr.review_id) as review_list,
array_agg(gn.genre_id) as genre_list,
array_agg(gp.id) as release_list
FROM gb_game g
LEFT JOIN gb_release gp ON g.id = gp.game_id
LEFT JOIN gb_game_metacritic gm ON g.id = gm.game_id
LEFT JOIN gb_game_reviews gr ON g.id = gr.game_id
LEFT JOIN gb_game_genre gn ON g.id = gn.game_id
GROUP BY g.id
ORDER BY g.release_date
DESC limit 25 offset 0
Limit (cost=66391.46..66391.52 rows=25 width=294)
-> Sort (cost=66391.46..66511.58 rows=48051 width=294)
Sort Key: g.release_date
-> GroupAggregate (cost=1.56..65035.49 rows=48051 width=294)
Group Key: g.id
-> Merge Left Join (cost=1.56..53579.05 rows=691686 width=294)
Merge Cond: (g.id = gn.game_id)
-> Merge Left Join (cost=1.14..16374.78 rows=63464 width=290)
Merge Cond: (g.id = gp.game_id)
-> Merge Left Join (cost=0.85..10856.60 rows=48051 width=282)
Merge Cond: (g.id = gr.game_id)
-> Merge Left Join (cost=0.58..10676.85 rows=48051 width=278)
Merge Cond: (g.id = gm.game_id)
-> Index Scan using platforms_game_pkey on gb_game g (cost=0.29..8984.87 rows=48051 width=274)
-> Index Scan using gb_game_metacritic_6072f8b3 on gb_game_metacritic gm (cost=0.29..1264.75 rows=24569 width=8)
-> Index Scan using gb_game_reviews_6072f8b3 on gb_game_reviews gr (cost=0.28..51.04 rows=686 width=8)
-> Index Scan using platforms_release_6072f8b3 on gb_release gp (cost=0.29..4604.75 rows=63464 width=12)
-> Materialize (cost=0.42..27979.58 rows=523702 width=8)
-> Index Scan using gb_game_genre_6072f8b3 on gb_game_genre gn (cost=0.42..26670.33 rows=523702 width=8)
The release_date
column doesn't have many repeats other than null.
Everything is fast until the final sort.
Is there a special kind of index I need to use to speed up this query?