172 похожих чатов

Привет. Мне нужно хранить и изредка отдельной миграцией обновлять где-то миллион

довольно ветвистых объектов, в json они верят по 200 кб.
Для простоты решил затестить постгрес и в-общем, результаты неутешительные, такая миграция (просто постоянный поток цельных апдейтов jsonb поля) в один тред добавляет cpu где-то процентов 30-40 и в итоге миграция занимает почти сутки.
Так как с маленькими json все было ок, подозреваю, что проблема в размере и что база захлебывается операциями с toast'ами.
Вообще говоря, я нахожу это странным, заапдейтить миллион jsonов по 200кб (даже не по метру) не кажется большим хайлоадом, но вот так вот.
(база - амазон аврора, если интересно).
Сразу скажу, что идея переделать "большие" json на несколько маленьких мне не нравится, потому что тогда 1 лям строк превратится в 100.

Соответственно, вопрос, можно ли здесь что-то сделать? Подтюнить как-то базу или таблицу? Или постгрес совсем для этого не подходит?

Что пробовали:
1. bytea вместо jsonb - без изменений
2. Gzip + bytea вместо jsonb - раза в 2 быстрее
3. Mongodb - без оптимизаций оказалась в 2 раза быстрее pg

Думаем затестить large objects store в постгре пока, но что-то этот вариант не нравится.

16 ответов

22 просмотра

больше 2К вызывает неименуемые оверхед

Evgeny- Автор вопроса
central hardware
больше 2К вызывает неименуемые оверхед

Двух килобайт, в смысле? Ну это же совсем мало :)

Evgeny- Автор вопроса
central hardware
ну такие ограничения у postgres by design

А почему 2? Минимальный размер тоста же 8кб

Evgeny
А почему 2? Минимальный размер тоста же 8кб

думаю, что central имел ввиду, если без TOAST. Если с TOAST, то можете 200 кб хранить:) Просто будет обращение к стороннему месту хранения, а не в рамках страницы

Evgeny- Автор вопроса

Это как раз понятно. Я и говорю, что с ростом размера json растёт потребление cpu базой, в который она в итоге и упирается. И я подозреваю, что это как раз нарезка json'ов на тосты.

Evgeny- Автор вопроса

Для меня это объект среднего размера, мне тут нужно many2many агрегаты считать между несколькими большими таблицами и казалось, что сгенерить и записать один средний 200кб json проще, чем 100 маленьких.

ну, может просто в вашем случае не нужно хранить в jsonb, раз это не оптимальное решение для вас? иначе у вас все объекты в TOAST лежат

Evgeny- Автор вопроса
Anatoliy Burov
ну, может просто в вашем случае не нужно хранить в...

У меня ветвистый и вложенный объект и как раз в json его хранить суперудобно, иначе он превратится в кучу джоинов на х100 строк от текущего. Ок, спасибо все равно, буду посмотреть.

Evgeny
А почему 2? Минимальный размер тоста же 8кб

Размер страницы 8 КБ, но постгрес старается в одну страницу впихнуть хотя бы четыре строки (и toast-таблиц это тоже касается).

Evgeny- Автор вопроса

Вот эти все олапы это конечно то, чего я так хотел избежать :(

Evgeny- Автор вопроса

Мне не нужны отчёты. Короче, просто для бизнесовых нужд хочется посчитать агрегаты и просто записать их на диск, чтобы потом их быстро читать и за счёт этого быстро отдавать ответ пользователю. Ладно, это лирика уже. Попробую наверное действительно какие то другие базы для этого, по идее мне реляционки не нужны здесь, просто хочется фигачить по ключу и потом читать json'ы. Постгря просто всегда под рукой, были иллюзии, что она будет приемлемо быстро это делать.

Evgeny
Мне не нужны отчёты. Короче, просто для бизнесовых...

попробуйте поменять pglz на lz4: https://www.postgresql.fastware.com/blog/what-is-the-new-lz4-toast-compression-in-postgresql-14 если станет лучше - отпишитесь плз о результатах

Мы уже лет 10 используем упаковку + bytea У нас настройки: if ($len < 262144) { ($ztype, $args) = (COMPRESS_ZSTD, {quality => 9}); } elsif ($len < 524288) { ($ztype, $args) = (COMPRESS_ZSTD, {quality => 8}); } elsif ($len < 2097152) { ($ztype, $args) = (COMPRESS_ZSTD, {quality => 7}); } else { ($ztype, $args) = (COMPRESS_ZSTD, {quality => 6}); } ZSTD - это https://ru.wikipedia.org/wiki/Zstandard В свое время мы уперлись в то что jsonb у нас упирался в сетевой интерфейс

Evgeny- Автор вопроса

А что вы хотели? 200кб это 25 страниц, итого получается 25 миллионов iop. Немало. Постарайтесь нормализовать максимально изменяемые данные.

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта