Причиной замедления являются неверные оценки количества строк, которые заставляют PostgreSQL выбрать соединение с вложенным циклом.Почти все ваше время тратится на сканирование индекса на hfj_res_link
, которое повторяется 1113 раз.
Моя первая попытка будет на ANALYZE hfj_spidx_date
и посмотреть, поможет ли это.Если да, убедитесь, что автоматический анализ обрабатывает эту таблицу чаще.
Следующая попытка будет
SET default_statistics_target = 1000;
, а затем ANALYZE
, как указано выше.Если это поможет, используйте ALTER TABLE
, чтобы увеличить STATISTICS
в столбцах hash_identity
и sp_value_high
.
Если это тоже не поможет, и у вас есть последняя версия PostgreSQL, вы можетепопробуйте расширенную статистику :
CREATE STATISTICS myparamsda2_stats (dependencies)
ON hash_identity, sp_value_high FROM hfj_spidx_date;
Затем ANALYZE
таблицу еще раз и посмотрите, поможет ли это.
Если все это не помогает, и вы не можете получитьоценки верны, вы должны попробовать другой угол:
CREATE INDEX ON hfj_res_link (target_resource_id, src_resource_id);
Это должно значительно ускорить сканирование индекса и дать вам хорошее время отклика.
Наконец, если ни один из вышеперечисленных не имеетлюбой эффект, вы можете использовать грубую меру запрета соединений с вложенными циклами для этого запроса:
BEGIN;
SET LOCAL enable_nestloop = off;
SELECT /* your query goes here */;
COMMIT;