Стоимость запроса, отображаемая планировщиком, является функцией структуры ваших индексов, а также относительной частоты определенных значений в соответствующих таблицах. PostgreSQL отслеживает наиболее распространенные значения, видимые во всех столбцах всех ваших таблиц, так что он может получить представление о том, с каким количеством строк может работать каждый этап каждого плана.
Эта информация может устареть. Если вы действительно пытаетесь получить точное представление о том, насколько дорогим является запрос, убедитесь, что статистика, используемая postgres, актуальна, выполнив оператор VACUUM ANALYZE
.
Кроме того, планировщик вынужден сделать несколько сравнений яблок с апельсинами; каким-то образом сравнивая время, которое требуется для поиска, со временем, которое требуется для выполнения тесного цикла по отношению в памяти. Поскольку разные аппаратные средства могут выполнять эти операции с разными относительными скоростями, иногда, особенно для близких связей, postgres может ошибаться. Эти относительные затраты можно настроить в конфигурации файла конфигурации вашего сервера
Edit:
Статистика, собранная postgesql, не относится к «производительности запросов» и не обновляется последовательными запросами. Они описывают только частоту и распределение значений в каждом столбце каждой таблицы (кроме случаев, когда они отключены). Наличие точной статистики важно для точного планирования запросов, но вы, оператор, должны сообщать PostgreSQL, как часто и с какой степенью детализации эти статистические данные должны быть собраны. Наблюдаемая вами несоответствие является признаком того, что данные о пластиках устарели или что вы могли бы выиграть от настройки других параметров планировщика.