Проблема неэффективных планов выполнения в PostgreSQL может быть обусловлена несколькими факторами, даже для подобных запросов. Вот некоторые из наиболее вероятных причин:
1. **Статистика**: PostgreSQL использует статистику для оценки стоимости выполнения различных операций. Если статистика устарела или недостаточно точна (например, если в таблицах регулярно добавляются/удаляются записи), оптимизатор может выбрать неэффективный план. Регулярно обновляйте статистику с помощью команды `ANALYZE`.
2. **Выборка данных**: Различия в объемах данных, подходящих под фильтры в `WHERE`, могут влиять на выбор плана. Если в одной из таблиц данных больше, чем в другой, это может привести к разному поведению планов.
3. **Размеры таблиц и индексов**: Объем данных в таблицах и индексов может меняться, и это влияет на то, какой план будет более эффективным. Если одна из таблиц значительно увеличилась в размере, это может влиять на оптимизатор.
4. **Настройки конфигурации**: Параметры конфигурации PostgreSQL, такие как `work_mem`, `effective_cache_size`, `random_page_cost`, и другие, могут влиять на то, как оптимизатор выбирает планы. Возможно, стоит поэкспериментировать с их значениями.
5. **Типы соединений и фильтров**: Разные типы соединений (например, Nested Loop, Hash Join) могут быть выбраны в зависимости от конкретных условий запроса. Иногда последовательный выбор соединения может приводить к различным планам для схожих запросов.
6. **Параллелизм**: Если в запросе задействован параллелизм (как показано в вашем выводе плана с `Gather` и `Workers Planned`), различия в доступных ресурсах или текущей загрузке системы могут вызвать выбор различных планов.
Чтобы лучше разобраться, вы можете сделать следующее:
- Запустите `ANALYZE` для обеих таблиц после проверки или изменения данных.
- Сравните статистику, используя `pg_stats` для ваших столбцов, чтобы увидеть, как различные параметры могут влиять на выбор плана.
- Используйте `EXPLAIN (ANALYZE, BUFFERS)` для более глубокого анализа планов выполнения.
- Поэкспериментируйте с настройками конфигурации, чтобы видеть, влияют ли они на выбор плана.
Если после всех этих шагов проблема все еще остается, возможно, стоит обратиться к сообществу PostgreSQL или разработать временное решение, например, использовать подсказки `SET enable_*` для принудительного выбора определенных планов.