Основной проблемой являются неверные ошибочные оценки при трех индексных сканированиях на four
с условиями ((kilo_two)::text = 'something'::text)
.
Так что, если вы
ALTER TABLE four ALTER kilo_two SET STATISTICS 1000;
(или, может быть, даже более высокие значения) и ANALYZE
таблицы, план запроса должен улучшиться.
Это, мы надеемся, избавит от оскорбительного Hash Right Join , которое стоит так дорого, вероятно потому, что оно повторяется 491 раз.
Было бы также полезно использовать частичный индекс для four
:
CREATE INDEX ON four ((kilo_two::text)) WHERE NOT whiskey_yankee;
Если ничего не помогает, вы можете принудительно выполнить один запрос без присоединения к вложенному циклу:
BEGIN;
SET LOCAL enable_nestloop = off;
SELECT /* your query */;
COMMIT;