Size: a a a

pgsql – PostgreSQL

2020 June 03

VH

Vladimir Holyavik in pgsql – PostgreSQL
Konstantin Knizhnik
Процедуры обычно позволяют значительно увеличить производительность работы.
Обычно разработчики в борьбе за скорость движутся по траектории ORM->SQL->PLpgSQL.
Те. сначала приложение работает с базой посредством какого-то ORM, потом критичные места переписываются на прямые SQLщапросы, если же и это не помогает, то пишут серверную процедуру. С процедурами основная проблема заключается в отладке и поддержке.

На простых запросах узким местом сейчас становится кана связи между клиентов и сервером. Т.е. 100% загрузить современный мощный сервер простыми  OLTP запросами не так то просто: мы упрёмся в сетку и систем каллы, а не в производительность базы. В этом отношении - stored procedures, которые могут запустить сразу много запросов на стороне сервера - это путь преодоления этого бутылочного горлышка.

Но иногда встроенные процедуры могут и тормозить. Это связано с тем, что  все не динамические запросы и встроенных процедур препарятся. Т.е. постгрес пытается использовать для них generic plan, не зависящий от конкретных значений параметров. При сильно перекошенных данных это может привести к значительному проседанию на некоторых наборах параметров.
Приперекосах это может привести к шар или дед локам ) .. а не только к просиданию )
>В этом отношении - stored procedures, которые могут запустить сразу много запросов на стороне сервера - это путь преодоления этого бутылочного горлышка.
Так же если исползовать секции with в рамках хранимых процедур вы рискуете выбрать всю доступную память для коннекта и налететь на SWOP данных ... что значительно уменьшит скорость работы
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Konstantin Knizhnik
Обычно время выполнения запроса, показываемое explain analyze почти не отличается от времени выполнения запроса без него. gettimeofday в большинстве систем реализован  достаточно эффективно и не требует system call-а.  Так что разница не должна превышать единиц процентов. Мне казалось, что негативный эффект на скорость работы от включённого  auto_explain  скорее будет связан с значительным  увеличением объёма записи в лог файл. Но это почти  не зависит от того включён ли analyze или нет.
Посмотрите пример https://t.me/pgsql/229640 . На этой системе gettimeofday ведёт себя нормально, если что.
Это крайний случай, конечно.
источник

VH

Vladimir Holyavik in pgsql – PostgreSQL
Если у Вас выборка работает за 1мс то это никак не гарантирует что при 100rps она так же будет работать за 1мс
и этот експанализ ни поможет
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Matthew
Хотим сделать запросы через процедуры к postgкуSQL, как это лучше сделать?
Не падает ли производительность от того, что написан в процедуре?
Кешируется ли план запроса для процедуры? Кешируется ли для sql-запроса? Что быстрее?
Если не процедура, то что использовать для выполнения запроса?
> как это лучше сделать?

Пишете процедуры, которые возвращают resultsets (лучше на SQL, чем на plpgsql, если это возможно), правильно их аннотируете (см. про volatility... и вообще, прочитайте документацию про это дело, там немного). Потом вызываете, и всё. ;)

> Не падает ли производительность от того, что написан в процедуре?

Зависит от того,  на каком PL процедура (большинство PL, кроме SQL, складывают результаты SRF во временное хранилище перед возвратом, например) / что за запрос (кеширование планов может влиять).
Также см. вот это: https://wiki.postgresql.org/wiki/Inlining_of_SQL_functions

> Кешируется ли план запроса для процедуры?

Для процедуры целиком — нет.

> Кешируется ли для sql-запроса?

Да.

> Что быстрее?

Inlined SQL function — в общем, то же самое, что и view. А так, в общем, функции чуть медленнее, чем запросы в них (чудес не бывает, да ;) ).

> Если не процедура, то что использовать для выполнения запроса?

Выше имелись в виду функции, конечно. Если не они — то parameterized SQL, тут особо вариантов нет...
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Vladimir Holyavik
Приперекосах это может привести к шар или дед локам ) .. а не только к просиданию )
>В этом отношении - stored procedures, которые могут запустить сразу много запросов на стороне сервера - это путь преодоления этого бутылочного горлышка.
Так же если исползовать секции with в рамках хранимых процедур вы рискуете выбрать всю доступную память для коннекта и налететь на SWOP данных ... что значительно уменьшит скорость работы
> Приперекосах это может привести к шар

Эээ... к чему?

> или дед локам )

Или, наоборот, увести от них. Т.е. это как-то мало связано, IMNSHO.

> Так же если исползовать секции with в рамках хранимых процедур

А это зависит от версии PostgreSQL, и от того, что написано внутри WITH.
И это поведение не отличается от поведения WITH в обычных запросах, нет?
источник

VH

Vladimir Holyavik in pgsql – PostgreSQL
согласен ..
источник

VH

Vladimir Holyavik in pgsql – PostgreSQL
простое предостережение
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Vladimir Holyavik
простое предостережение
Только мне лично неясно, в чём его суть.
Или нужно просто испытывать тревогу, когда думаешь о stored functions? ;)
источник

VH

Vladimir Holyavik in pgsql – PostgreSQL
Часто при написании хранимок писал секцию with в которых выполнял определенный предворительный расчет данных ..
и по одной ф-ции работают без проблем .. и я не замечал ни проблем с памятью ни просиданий по скорости ..
но после того как данные хранимки начали исрользоваться по 100 в сек .. начались проблемы с памятью... и именно из за того что секция with держит все в памяти потока ...
источник

VH

Vladimir Holyavik in pgsql – PostgreSQL
или я не прав ?
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Vladimir Holyavik
или я не прав ?
Скорее всего, правы (до v12).
Только если заменить в этой истории слово "хранимки" на "запросы" — скорее всего, ничего бы по сути не изменилось.
Т.е. это история про WITH, а не про "хранимки".
источник

VH

Vladimir Holyavik in pgsql – PostgreSQL
да скорее всего таки про WITH .. но так как не сторонник внешних запросов то не акцентировался )
источник

Ð

Ð in pgsql – PostgreSQL
у меня свежие решения целиком на хранимках на plpgsql, даже однострочные селекты. Потому что так легче поддерживать и мутировать модель в целом, функции - как методы доступа к данным и способ инкапсуляции структуры данных. Работает чрезвычайно быстро, и легко вести статистику запросов. Неприятный нюанс был в том, что функции на sql неправильно строили план и тормозили, при этом запрос в чистом виде или в plpgsql работал нормально
источник

VH

Vladimir Holyavik in pgsql – PostgreSQL
Ð
у меня свежие решения целиком на хранимках на plpgsql, даже однострочные селекты. Потому что так легче поддерживать и мутировать модель в целом, функции - как методы доступа к данным и способ инкапсуляции структуры данных. Работает чрезвычайно быстро, и легко вести статистику запросов. Неприятный нюанс был в том, что функции на sql неправильно строили план и тормозили, при этом запрос в чистом виде или в plpgsql работал нормально
С помощью чего Вы фиксировали "тормоза" ?
источник

Ð

Ð in pgsql – PostgreSQL
pg stat statements
источник

Ð

Ð in pgsql – PostgreSQL
он удобно показывает на проде в каком месте надо копать горло
источник

VH

Vladimir Holyavik in pgsql – PostgreSQL
В курсе ) .. не слышал что бы план строился не правильно
источник

Ð

Ð in pgsql – PostgreSQL
я тоже не слышал но сталкивался с такой аномалией, почему оно так было я не заню, просто замена языка без изменения запроса помогла
источник

l

lnuynxa in pgsql – PostgreSQL
Ð
pg stat statements
а как там отображаются хранимки?  как sql запрос находящийся в них?
источник

Ð

Ð in pgsql – PostgreSQL
нет, как запуск хранимки. Тормозящую хранимку надо разбирать и анализировать отдельно
источник