Медленно работающий запрос Postgres - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть этот запрос, который занимает очень много времени в моей базе данных.Этот SQL генерируется из ORM (Hibernate) внутри приложения.У меня нет доступа к исходному коду.

Мне было интересно, может ли кто-нибудь взглянуть на следующий вывод ANALYZE EXPLAIN и предложить какие-либо настройки Postgres, которые я могу сделать.

Я не знаюНе знаю, с чего начать или как настроить мою базу данных для обслуживания этого запроса.

Запрос выглядит так

select 
    resourceta0_.RES_ID as col_0_0_ 
from
    HFJ_RESOURCE resourceta0_ 
    left outer join HFJ_RES_LINK myresource1_ on resourceta0_.RES_ID = myresource1_.TARGET_RESOURCE_ID 
    left outer join HFJ_SPIDX_DATE myparamsda2_ on resourceta0_.RES_ID = myparamsda2_.RES_ID 
    left outer join HFJ_SPIDX_TOKEN myparamsto3_ on resourceta0_.RES_ID = myparamsto3_.RES_ID 
where 
    (myresource1_.SRC_RESOURCE_ID in ('4954427' ... many more))
    and myparamsda2_.HASH_IDENTITY=`5247847184787287691` and 
(myparamsda2_.SP_VALUE_LOW>='1950-07-01 11:30:00' or myparamsda2_.SP_VALUE_HIGH>='1950-07-01 11:30:00') 
    and myparamsda2_.HASH_IDENTITY='5247847184787287691' 
    and (myparamsda2_.SP_VALUE_LOW<='1960-06-30 12:29:59.999' or myparamsda2_.SP_VALUE_HIGH<='1960-06-30 12:29:59.999') 
    and (myparamsto3_.HASH_VALUE in ('-5305902187566578701')) 
limit '500'

А план выполнения выглядит следующим образом: https://explain.depesz.com/s/EJgOq

Редактировать - обновлено, чтобы добавить ссылку depesz.Редактировать 2 - добавлено больше информации о запросе.

1 Ответ

0 голосов
/ 14 февраля 2019

Причиной замедления являются неверные оценки количества строк, которые заставляют 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;
...