кучу разных запросов и вызовов функций, то скорость выполнения падает в десять и более раз.
Пример:
BEGIN;
SELECT fnc.fnc1();
...
SELECT fnc.fnc99999();
COMMIT;
Время выполнения SELECT fnc.fnc1() - 10 секунд;
В случае
BEGIN;
SELECT fnc.fnc1();
...
SELECT fnc.fnc2();
COMMIT;
Время выполнения 0.5 сек.
Функция делает ровно одинаковые действия (внутри неё селект и апдейт 3х таблиц).
Состояние бд 1 в 1.
Кто может обьяснить в чем причина?
Это из за настроек wal? Или из за других параметров в conf?
Заранее благодарен.
Пг. 9.6
BEGIN; SELECT fnc.fnc1(); ... SELECT fnc.fnc99999(); COMMIT; BEGIN; SELECT fnc.fnc1(); ... SELECT fnc.fnc2(); COMMIT; у вас один случай от другого в примере отличается названием функции. В первом fnc99999, а во втором fnc2(). Может проблема имени функции?. А если серьезно, то примеры некорректные
Для начала разговора о скоостях запроса сообщите информацыю из закрепа: https://t.me/pgsql/303899 Без этого такой разговор будет беспредметным.
В том, что по крайней мере одна из перечисленных предпосылок: > Функция делает ровно одинаковые действия (внутри неё селект и апдейт 3х таблиц). > Состояние бд 1 в 1. неверна, или же что-то в самом описании проблемы неверно. Иначе придётся признать, что PostgreSQL умеет предсказывать будущее, понимаете? ;)
>признать, что PostgreSQL умеет предсказывать будущее, Как что-то сложное! (Умеет, конечно. Вон, estimate в планировщике -- что это ещё по-вашэму?)
Это оценка. А вот именно то, что описал @stepanowich, просто невозможно.
>, просто невозможно. Возможно. Но не реализовано. При этом я могу представить несколько вариантов -- когда его описание будет правдой. Например, если в сэссии этот вызов выполняется несколько раз последовательно...
> Возможно. Но не реализовано. Что именно? Хотя... зависит от того, что конкретно имелось в виду под "Состояние бд 1 в 1", да.
Могу скинуть 2 скрипта. Сразу станет ясно тело вопроса. Сюда можно кидать файлы?
Ну да, в виде вложений. Или можете на какой-то paste site выложить.
>Что именно? Глобальные оптимизацыи между процэдурами, внеочередное выполнение вызовов и прочие весёлые методы оптимизацыи, которые могут привести к таким результатам непосредственно.
> Глобальные оптимизацыи между процэдурами Чтобы они были, вся последовательность вызовов процедур должна быть получена PostgreSQL сразу (и всё равно postgres сейчас ничего такого не делает, да), а по вопросу у меня сложилось впечатление (по "внутри одной транзакции выполняю кучу разных запросов"), что запросы в транзакции посылаются по одному (а зря, как уже видно (DO в примере — это всего один statement)).
Обсуждают сегодня