Как стать автором
Обновить

Комментарии 14

А, хинты в pg завезли!

SELECT /*+ MergeJoin(a b) */ *
    FROM pgbench_branches b
    JOIN pgbench_accounts a ON b.bid = a.bid
    ORDER BY a.aid;

Доступно только в pro версии?

Расширение pg_hint_plan с открытым исходным кодом и совместимо со всеми поддерживаемыми версиями PostgreSQL. Инструкция по установке из официального репозитория
В Pro версию тоже входит, поэтому русскоязычная документация по модулю расположена в разделе enterprise

pgpro_stats входит в Postgres Pro Standart и Enterprise
В ванильной версии только pg_stat_statements

[сообщение боли]

Блин... Как же далёк постгрес от нормальных продуктов где из коробки есть то, что тут или нет или приседать надо чтобы получить подобие.

Блин2... но вынужден изучать его нюансы и читать за него ибо вопрос о его использовании решён(не нами-разработчиками) в компании.

[/сообщение боли]

Вместо log_min_duration_statement советую pg_store_plans
https://ossc-db.github.io/pg_store_plans/ все таки родной sql , это гораздо удобнее чем запись планов в логфайл (особенно, если у вас приличные нагрзуки).
И (позвольте немного попиарюсь) к этому , еще прикрутил историю сессий - https://habr.com/ru/companies/uzum/articles/865622/ , и получил практически awr оракловый ). Так что можно жить и с Postgres, просто тут принцип другой, минимум - из коробки.

Спасибо!

В тему сохранения долгих запросов (и не только) могу добавить рекомендацию почитать про pg_profile. А для облегчения чтения логов - pgBadger.
Вдруг кому-нибудь окажется полезным.

Раз уж зашла речь о pgBadger спрошу. Если включен auto_explain и план пишет в логи, в отчет pgBadger должен explain попадать? У меня почему то не попадает.

Может, установлен флаг?
--noexplain : do not process lines generated by auto_explain

Да нет. Вот команда которой выгружаю:

pgbadger -j6 -a1 -s10 -t50 -f stderr postgresql-2025-01-24.log -o pg_log_24012025.html

Так же вертел-крутил log_line_prefix, ничего этим не добился. Не попадает explain в отчет и все тут.

Здравствуйте, спасибо, интересно было почитать про выбор метода в зависимости от сложности. Скажите, как поступать в случае, если есть допустим запрос где используется куча JOIN и подзаросов. В определенном месте плана планировщик выбирает nested loop. Запрос длится 1 час. Как только отключаешь через SET enable_nestedloop = off, время запроса сокращается до 13 сек. Такие запросы только переписывать?

Не обязательно. Тут может быть несколько подходов:

1) Если планировщик не оптимально выбрал метод из-за устаревшей статистики по некоторой таблице, может помочь своевременный запуск ANALYSE по этой таблице перед запуском запроса. Часто его использовать не стоит - может долго выполняться, но с некоторой периодичностью может быть полезно.

2) Раз выяснили, что отключение Nested Loop хорошо работает для этого запроса (несмотря на большое число операций в нём), можно «прилепить» этот SET к запросу (SET LOCAL внутри транзакции).

3) Самый элегантный способ, чтобы не переписывать запрос и не делать дополнительных действий: добавить к нему hint.

Забыл сказать, что такое поведение заметили после апгрейда версии с Postgres PRO 11.7 Ent на Postgres PRO 15.1.10. Долго сидели над этим, игрались с параметрами, но с помощью параметров купировать это не удалось.

1) Статистика актуальна, таблицы довольно горячие и с обновлением статистики неплохо справляется autovacuum analyze. Дело в чем-то другом, пока не понимаю в чем.

2) К сожалению, нету доступа к коду приложения чтобы SET сделать.

3) Все таки hint? Я почему то больше склонялся к sr_plan.

Если ни первое, ни второе, ни третье, то тогда рефакторинг запроса?

  • mean_exec_time — среднее время выполнения запроса;

В данном случае, есть одна серьезная проблема - "среднее арифметическое" неустойчиво к выбросам. А выбросы в продуктивной СУБД и особенно в облаках - это норма.

В результате - возможны аномалии. Например , встретил такое :

https://dzen.ru/a/Z1--cZ4sHEmzLsy5

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

Зарегистрируйтесь на Хабре, чтобы оставить комментарий