Size: a a a

pgsql – PostgreSQL

2020 June 13

s

sexst in pgsql – PostgreSQL
2flower _
ну на такие вещи вроде бы кафку натравливают, но хранилище все равно субд.
Таки зависит. Иногда реально единственный вариант - агрегировать в структуры данных в оперативке и периодически батчи в СУБД писать. Биллинг - хороший пример. Хотя бы потому что клиенты не обидятся, если у вас считалка почему-то жестко рухнет и минуту статистики потеряет - они от этого ничего не прогадают.
И да, насчёт блокировок, гонок и этого вот всего - на свете есть погромисты, которые умеют не косячить в таких задачах. А ещё на свете давно уже есть немало языков, которые многие потенциально проблемные места выявляют ещё на этапе сборки.
источник

s

sexst in pgsql – PostgreSQL
А kafka не очень подходит для ситуаций, когда у вас миллионы сообщений в секунду размером по 50 байт. Туда всё-таки лучше бо́льшими кусками писать, хотя бы килобайт в идеале. Вот и выходит что один хрен агрегировать нужно самому сначала.
источник

s

sexst in pgsql – PostgreSQL
Александр Ремизов
Робот не ошибается. ОРМ только обертка в виде ООП. Если запрос ужасен, скорее всего вы не прочитали документацию по ОРМ и не поняли логику формирования запроса на ОРМ
Сейчас бы, вместо изучения sql, сесть и научиться велосипедить под самые популярные ORM с прицелом на то, чтобы запросы нормальные получались.
источник

AS

Alexey Stavrov in pgsql – PostgreSQL
Ого, serializable в pg12.3 - не serializable.
http://jepsen.io/analyses/postgresql-12.3
источник

AS

Alexey Stavrov in pgsql – PostgreSQL
Кто-нибудь знает примеры g2 и g2-item?

Я нашел только определения:
G2-item: Item Anti-dependency Cycles (write skew on disjoint read)

G2: Anti-Dependency Cycles (write skew on predicate read)
источник

2_

2flower _ in pgsql – PostgreSQL
sexst
Таки зависит. Иногда реально единственный вариант - агрегировать в структуры данных в оперативке и периодически батчи в СУБД писать. Биллинг - хороший пример. Хотя бы потому что клиенты не обидятся, если у вас считалка почему-то жестко рухнет и минуту статистики потеряет - они от этого ничего не прогадают.
И да, насчёт блокировок, гонок и этого вот всего - на свете есть погромисты, которые умеют не косячить в таких задачах. А ещё на свете давно уже есть немало языков, которые многие потенциально проблемные места выявляют ещё на этапе сборки.
так я об этом же и писал, что можно посчитать не критичные вещи и снаружи, но списание срежств, например,  только через субд.
источник

KK

Konstantin Knizhnik in pgsql – PostgreSQL
Tagil Steel
Коллеги, подскажите!
Есть некая тяжелая вычислительная задача, связанная с активной работой с массивами.
Есть ее реализауия на pl/pgsql c неудовлетворительной производительностью - 10 секунд.
Есть реализация этой же задачи на C -  с отличной производительностью - 0.1 секунда, но по многим причинам решение на C использовать не получается. (В том числе и потому, что проект хостится на AWS RDB)
Вопрос: Что ожидать, если функцию переписать на PL/V8?
Есть ли шанс получить высокую производительность?
Почти на всех реальных тестах (тестах извлекающих данные из базы, а не вычисляющим числа Фиббоначи) pl/pgsql оказывался быстрее других встроенных языков включая pl/v8 (несмотря на JIT).
Хотя, возможно, именно при работе с массивами - это не так:
http://okbob.blogspot.com/2014/05/a-speed-of-pl-languages-for-atypical.html
Мне всегда было интересно увидеть реальный plpgsql код, который тормозит.
Я много раз думал насчёт JIT для plpgsql, но останавливало меня то, что на любых тестах в профиле я видел что угодно (GetSnapshotData, SPI_*,...) но только не интерпретатор plpgsql.
Так что был бы весьма признателен если бы вы мне прислали код вашей процедуры . А если ещё и сл схемой БД и каким-то генератором данных, чтобы можно было самому эту фукнцию запустить и попрофилить - было бы вообще идеально.
источник

2_

2flower _ in pgsql – PostgreSQL
Konstantin Knizhnik
Почти на всех реальных тестах (тестах извлекающих данные из базы, а не вычисляющим числа Фиббоначи) pl/pgsql оказывался быстрее других встроенных языков включая pl/v8 (несмотря на JIT).
Хотя, возможно, именно при работе с массивами - это не так:
http://okbob.blogspot.com/2014/05/a-speed-of-pl-languages-for-atypical.html
Мне всегда было интересно увидеть реальный plpgsql код, который тормозит.
Я много раз думал насчёт JIT для plpgsql, но останавливало меня то, что на любых тестах в профиле я видел что угодно (GetSnapshotData, SPI_*,...) но только не интерпретатор plpgsql.
Так что был бы весьма признателен если бы вы мне прислали код вашей процедуры . А если ещё и сл схемой БД и каким-то генератором данных, чтобы можно было самому эту фукнцию запустить и попрофилить - было бы вообще идеально.
да у него там кастомная агрегатная функция, которая как не только мне показалась лишней, а внутри тихий ужас чего только стоит это
FOREACH i in array state.ids
       LOOP
           IF i = id THEN
               RETURN ROW(state.ids, state.accum);
           end if;
       END LOOP;
сейчас автор вроде бы убрал этот кусок, как и было предложено сменить на id=any(state.ids), может чего еще поправил
и теперь с его слов выполняется за 0.8 с.

вот примерный код агрегатной функции

create or replace function common.sum_value_transition(
   state   common.sum_value_state,
   val     numeric,
   unit    integer,
   id      integer
)returns common.sum_value_state AS $$
declare
   i integer;
   accum numeric;
BEGIN
   FOREACH i in array state.ids
       LOOP
           IF i = id THEN
               RETURN ROW(state.ids, state.accum);
           end if;
       END LOOP;

   IF
jsonb_exists(state.accum, unit::text) THEN
       accum =
jsonb_extract_path(state.accum, unit::text)::numeric + val;
   ELSE
       accum = val;
   end if;
   RETURN ROW(id || state.ids, state.accum ||
jsonb_build_object(unit::text, accum))::common.sum_value_state;
END;
$$ LANGUAGE plpgsql;
источник

KK

Konstantin Knizhnik in pgsql – PostgreSQL
Понятно, начал читать сверху вниз и не дочитал до конца:(
источник

TS

Tagil Steel in pgsql – PostgreSQL
Konstantin Knizhnik
Понятно, начал читать сверху вниз и не дочитал до конца:(
В принципе, производительность сильно поднялась после замены foreach i in array ... на IF id = any(state.ids) ...
Теперь приемлемая, но все равно в несколько раз хуже, чем при этой же функции, написанной на С (правда, сильно оптимизированной - массив заменен b-деревом)
источник

2_

2flower _ in pgsql – PostgreSQL
Tagil Steel
В принципе, производительность сильно поднялась после замены foreach i in array ... на IF id = any(state.ids) ...
Теперь приемлемая, но все равно в несколько раз хуже, чем при этой же функции, написанной на С (правда, сильно оптимизированной - массив заменен b-деревом)
я вам вчера писал, вы не хотите слушать.
почему выросла производительность?
вы ваши неэффективные костыли заменили рабочим решением.
дальше также надо.
проблема ТОЛЬКО в вашем коде, а не "тормозах" pgplsql перед С.
я не удивлюсь, что оптимизированный код на pgplsql будет БЫСТРЕЕ, чем то, что вы написали на С.
В разработке я придерживаюсь инженерного, а не академического подхода.
Т.е. я тупее, чем те кто создавал средства, которые использую, значит их возможности надо использовать по максимуму.
Все просто.
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Alexey Stavrov
Кто-нибудь знает примеры g2 и g2-item?

Я нашел только определения:
G2-item: Item Anti-dependency Cycles (write skew on disjoint read)

G2: Anti-Dependency Cycles (write skew on predicate read)
Этот bug уже исправлен, и, соответственно, был добавлен isolation test для его воспроизведения — можете посмотреть там.
источник

TS

Tagil Steel in pgsql – PostgreSQL
2flower _
я вам вчера писал, вы не хотите слушать.
почему выросла производительность?
вы ваши неэффективные костыли заменили рабочим решением.
дальше также надо.
проблема ТОЛЬКО в вашем коде, а не "тормозах" pgplsql перед С.
я не удивлюсь, что оптимизированный код на pgplsql будет БЫСТРЕЕ, чем то, что вы написали на С.
В разработке я придерживаюсь инженерного, а не академического подхода.
Т.е. я тупее, чем те кто создавал средства, которые использую, значит их возможности надо использовать по максимуму.
Все просто.
Я написал запрос, в котором применяются такие агрегаты. Я на самом деле не знаю, как сделать без них без существенного усложнения и уменьшения эффективности.
Мы сделали так, как умеем - с функцией на С - там все хорошо, производительность практически такая же, как с в случае замены нашего агрегата на обычный SUM, то есть наш агрегат оптимален.
Если Вы знаете, как такую задачу решить без агрегата- с такой же эффективностью - напишите, буду благодарен.
Если есть возможность, то без общих слов о том, что надо все делать правильно и не надо ничего делать неправильно.
источник

2_

2flower _ in pgsql – PostgreSQL
Tagil Steel
Я написал запрос, в котором применяются такие агрегаты. Я на самом деле не знаю, как сделать без них без существенного усложнения и уменьшения эффективности.
Мы сделали так, как умеем - с функцией на С - там все хорошо, производительность практически такая же, как с в случае замены нашего агрегата на обычный SUM, то есть наш агрегат оптимален.
Если Вы знаете, как такую задачу решить без агрегата- с такой же эффективностью - напишите, буду благодарен.
Если есть возможность, то без общих слов о том, что надо все делать правильно и не надо ничего делать неправильно.
вам вчера ванга пытался пример привести, не зачем создавать массивы, и придумывать алгоритмы, которые готовы и эффективны
в субд, один из них я вам написал.
я не могу вам помочь, т.к. вы задачу не описали ПОЛНОСТЬЮ.
но мое мнение, вам тупо надо приготовить данные, которые вы храните в массиве через cte например,  и затем с агрегировать обычным sum.
т.е. в начале вы готовите данные, а затем обрабатываете. В вашем случае каша. Вы не даете пг помочь вам.
источник

TS

Tagil Steel in pgsql – PostgreSQL
2flower _
вам вчера ванга пытался пример привести, не зачем создавать массивы, и придумывать алгоритмы, которые готовы и эффективны
в субд, один из них я вам написал.
я не могу вам помочь, т.к. вы задачу не описали ПОЛНОСТЬЮ.
но мое мнение, вам тупо надо приготовить данные, которые вы храните в массиве через cte например,  и затем с агрегировать обычным sum.
т.е. в начале вы готовите данные, а затем обрабатываете. В вашем случае каша. Вы не даете пг помочь вам.
В Вашем примере появляется еще один вложенный селект - для того, чтобы просуммировать разные единицы измерения.
Вы считаете это лучше, чем. написать функцию? Мы так делали, получили худшую производительность. Оно и понятно - где селект, там создание временной таблицы...
источник

KK

Konstantin K in pgsql – PostgreSQL
хз почему вас пугают вложенные селекты
источник

2_

2flower _ in pgsql – PostgreSQL
Tagil Steel
В Вашем примере появляется еще один вложенный селект - для того, чтобы просуммировать разные единицы измерения.
Вы считаете это лучше, чем. написать функцию? Мы так делали, получили худшую производительность. Оно и понятно - где селект, там создание временной таблицы...
вы с поиском совершили грубейшую ошибку в производительности, я даже не знаю как не один человек это пропустил, это
просто дичь.
поэтому без обид, но можно я оставлю себе возможность сомневаться в оптимальном исполнении ваших возможностей.
лучше напишите скрипт с вложенными sql который тормозит
источник

AS

Alexey Stavrov in pgsql – PostgreSQL
Yaroslav Schekin
Этот bug уже исправлен, и, соответственно, был добавлен isolation test для его воспроизведения — можете посмотреть там.
Спасибо, вас не затруднит скинуть ссылку на комит?
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
sexst
Таки зависит. Иногда реально единственный вариант - агрегировать в структуры данных в оперативке и периодически батчи в СУБД писать. Биллинг - хороший пример. Хотя бы потому что клиенты не обидятся, если у вас считалка почему-то жестко рухнет и минуту статистики потеряет - они от этого ничего не прогадают.
И да, насчёт блокировок, гонок и этого вот всего - на свете есть погромисты, которые умеют не косячить в таких задачах. А ещё на свете давно уже есть немало языков, которые многие потенциально проблемные места выявляют ещё на этапе сборки.
> И да, насчёт блокировок, гонок и этого вот всего - на свете есть погромисты, которые умеют не косячить в таких задачах.

И на свете их на самом деле человек этак сто. ;) Но да, есть много "погромистов", которые почему-то думают, что умеют.
источник

YS

Yaroslav Schekin in pgsql – PostgreSQL
Alexey Stavrov
Спасибо, вас не затруднит скинуть ссылку на комит?
источник