В EXPLAIN вы видите два последовательных шага: Seq Scan с cost=0.00..120000.00 и затем Aggregate с cost=120000.00..120500.00. С чего логичнее начать поиск узкого места?

AС шага с самой большой «стоимостью» и объёмом данных (здесь Seq Scan), потому что он кормит все остальные узлы плана.
BС верхней строки плана, потому что она выполняется первой и задаёт порядок чтения данных всеми нижними узлами.
CС любого шага, где встречается слово Aggregate, потому что агрегаты всегда самые дорогие в плане выполнения.
DС названия индекса в плане: если индекса нет в списке узлов, значит запрос обречён на медленное выполнение.
Правильный ответ. Ищите тяжёлые узлы по cost и rows и помните, что «нижние» шаги кормят «верхние».

Разбор

Обычно имеет смысл смотреть на узлы, которые читают или генерируют много строк (часто это сканы и сортировки). Если «внизу» много работы, то «наверху» это уже не исправить. Поле cost — не время выполнения, но оно помогает быстро понять, где планировщик ожидает основные затраты, а rows показывает объём данных между узлами.

Проверь себя · 1/3разбор после ответа
Есть запрос SELECT * FROM events WHERE user_id = 42 ORDER BY created_at DESC LIMIT 50. Какой вариант индекса чаще всего помогает, чтобы избежать Sort и быстро получить первые строки?
Тренировать SQL в Telegram

Ещё вопросы по теме «EXPLAIN и оптимизация»