Size: a a a

pgsql – PostgreSQL

2020 June 03

YS

Yaroslav Schekin in pgsql – PostgreSQL
Dmitry
Господа, может у вас будут идеи. У меня внезапно без изменения каких-либо параметров, упала скорость запроса в постгре, если в начале дня select request выполнялся за 100мс, то к концу дня этот показатель упал до 1000-1200мс, ума не приложу куда копать
В мониторинг, например. А для конкретного запроса — в EXPLAIN (ANALYZE, BUFFERS).
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
W
можно ли сделать в таблице тип uint16 ? и uint8 ?
Нет, unsinged типов в PostgreSQL нет.
источник

W

W in pgsql – PostgreSQL
Хм
источник

D

Dmitry in pgsql – PostgreSQL
А какие утилиты есть смысл использовать для проверки базы данных. Я покидал эксплейны на обычные короткие запросы вроде SELECT count(*) FROM pg_class, pg_index WHERE oid = indrelid AND indisunique;, - вроде всё норм 1.1-1.3мс, запрос который летит от приложения я продублировать не могу, т.к. он через навороченную функцию отправляется, а у меня слишком слабое понимание самой постгри чтобы понять что он конкретно делает и выполнить что-то похожее. Соответственно, мб есть какие-то готовые решения, которые позволяют проверить целостность базы данных?
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Dmitry
А какие утилиты есть смысл использовать для проверки базы данных. Я покидал эксплейны на обычные короткие запросы вроде SELECT count(*) FROM pg_class, pg_index WHERE oid = indrelid AND indisunique;, - вроде всё норм 1.1-1.3мс, запрос который летит от приложения я продублировать не могу, т.к. он через навороченную функцию отправляется, а у меня слишком слабое понимание самой постгри чтобы понять что он конкретно делает и выполнить что-то похожее. Соответственно, мб есть какие-то готовые решения, которые позволяют проверить целостность базы данных?
Как связаны timinings и "целостность базы данных"?
Какая у Вас конкретно проблема?
источник

D

Dmitry in pgsql – PostgreSQL
Yaroslav Schekin
Как связаны timinings и "целостность базы данных"?
Какая у Вас конкретно проблема?
конкретная проблема в том, что запросы стали обрабатываться дольше в 10-15 раз. Своп есть, но небольшой, память на виртуалке расширили и она практически полностью cached. Как посмотреть насколько приросли таблицы за определенный промежуток времени, я честно говоря хз
источник

АФ

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

s

sexst in pgsql – PostgreSQL
W
можно ли сделать в таблице тип uint16 ? и uint8 ?
Можно повесить на обычный целочисленный тип check (value >= 0)
источник

s

sexst in pgsql – PostgreSQL
Не совсем то же самое, но отрицательные числа записать не даст)
источник

АФ

Александр Филиппенко... in pgsql – PostgreSQL
Yaroslav Schekin
> как это лучше сделать?

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

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

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

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

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

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

Да.

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

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

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

Выше имелись в виду функции, конечно. Если не они — то parameterized SQL, тут особо вариантов нет...
https://www.youtube.com/watch?v=ZFLs7-vmbdM
а тут советуют сразу json возвращать.
По идее же должно получиться чуть больше трафика, но меньше накладных расходов на маппинг, на стороне бэкенда?
источник

s

sexst in pgsql – PostgreSQL
Я вот что-то совсем не уверен что json пропарсить будет менее затратно. Не говоря уже про то, что собрать его тоже ресурсов стоит.
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Dmitry
конкретная проблема в том, что запросы стали обрабатываться дольше в 10-15 раз. Своп есть, но небольшой, память на виртуалке расширили и она практически полностью cached. Как посмотреть насколько приросли таблицы за определенный промежуток времени, я честно говоря хз
Ну так см. в мониторинг, казалось бы.
Или, если знаете конкретные запросы — в их планы.
А про рост таблиц — надёжно не посмотреть, если нет старых копий базы (или Вы эту информацию где-то не записали).
источник

АФ

Александр Филиппенко... in pgsql – PostgreSQL
sexst
Я вот что-то совсем не уверен что json пропарсить будет менее затратно. Не говоря уже про то, что собрать его тоже ресурсов стоит.
так а если он фронту нужен, а на бэке его парсить не надо, отдать как есть, и всё?
источник

s

sexst in pgsql – PostgreSQL
Александр Филиппенко
так а если он фронту нужен, а на бэке его парсить не надо, отдать как есть, и всё?
Если так - возможно. Но как-то не особенно масштабируемо смотрится
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Александр Филиппенко
На каком-то из постгрес-вторников говорили что лучше использовать функции на sql, потому что они инлайнятся, а plpgsql намного медленнее.
Я тестил разные варианты, почти всегда выигрывает обычный запрос.
plpgsql обычно чуть быстрее sql функции по факту, но cost почему-то больше у plpgsql.
У вас есть какой-то критерий для выбора подхода? Чтобы не тестить все варианты.
> Я тестил разные варианты, почти всегда выигрывает обычный запрос.

Хмм... вопрос в том, насколько. У Вас вообще получилось заметить отличие производительности inlined SQL function от запроса?

> plpgsql обычно чуть быстрее sql функции по факту

Странно. Как и что Вы тестировали?

> но cost почему-то больше у plpgsql.

Потому что PostgreSQL не знает и не может знать, сколько стоит функция на произвольном PL, конечно. ;)
Этот cost задаёте Вы (если хотите).
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Собрал JSON на сервере, разобрал на клиенте ("магически" значения из него почему-то не извлекаются) — романтика! ;)
Кроме шуток, это зависит от того, какой результат (в каком виде) нужен на клиенте. Если именно JSON — ещё можно подумать, IMHO.
источник

Ð

Ð in pgsql – PostgreSQL
вот кстати к слову о маленьких словарях, секскан по таблице на 6 строк без индекса занимает 50мс
источник

s

sexst in pgsql – PostgreSQL
Обычный запрос то может быть и легче. Проблема может быть в том, что запросы пишете не вы, а погромисты, которые в это ваш SQL не умеют и не хотят, поэтому пользуются какой-нибудь безумной ORM. И вот к вам уже летят ТАКИЕ запросы, что любой оверхед вызова функции покажется несуществующим на фоне профита от нормально написанного запроса внутри.
источник

Ð

Ð in pgsql – PostgreSQL
а с индексом запрос 0.07 мс при условии что все строки попадают в where
источник

Ð

Ð in pgsql – PostgreSQL
Timing: Generation 0.673 ms, Inlining 2.600 ms, Optimization 24.830 ms, Emission 13.885 ms, Total 41.988 ms
источник