У меня запрос, который выполняется медленно. Я почти уверен, что узким местом является последовательное сканирование в плане, поэтому я хотел бы создать соответствующие индексы и / или изменить порядок своего запроса, чтобы улучшить его.
Вот мой запрос (и Вот скрипка со схемой и тестовыми данными ):
SELECT conversations.id, max(messages.timestamp) as latest_message FROM
conversations JOIN messages on conversations.id = messages.cid
WHERE conversations.userid=1
GROUP BY conversations.id ORDER BY latest_message;
Я создал индексы для всех задействованных столбцов и вложенные индексы для cid
и timestamp
в обоих направлениях, все безрезультатно. Остается последовательное сканирование:
Sort (cost=200.60..200.65 rows=20 width=12)
Sort Key: (max(messages."timestamp"))
-> HashAggregate (cost=199.97..200.17 rows=20 width=12)
Group Key: conversations.id
-> Hash Join (cost=11.50..197.97 rows=400 width=12)
Hash Cond: (messages.cid = conversations.id)
-> Seq Scan on messages (cost=0.00..160.00 rows=10000 width=12)
-> Hash (cost=11.25..11.25 rows=20 width=4)
-> Seq Scan on conversations (cost=0.00..11.25 rows=20 width=4)
Filter: (userid = 10)
Как мне улучшить этот запрос и / или какие индексы можно построить, чтобы исправить это последовательное сканирование?