Как читать план запроса: что искать в EXPLAIN (ANALYZE, BUFFERS) в первую очередь?
План читают снизу вверх и изнутри наружу: самые вложенные узлы выполняются первыми. Смотреть надо на четыре вещи. Расхождение оценки и факта: rows=1000 против actual rows=980000 означает, что планировщик ошибся в оценке и выбрал неподходящую стратегию — почти всегда причина в устаревшей статистике или в корреляции условий. Тип доступа: Seq Scan по большой таблице с узким фильтром — кандидат на индекс, но Seq Scan при выборке половины таблицы нормален. Способ соединения: Nested Loop с большим числом итераций — типичный признак недооценки; Hash Join требует памяти, и Batches > 1 означает, что хеш не поместился и ушёл на диск. Буферы: shared read — чтения мимо кэша, temp read/written — сортировка или хеш на диске, то есть нехватка work_mem. Время в плане накопительное: из времени родителя вычитают время детей, иначе ошибочно винят верхний узел.