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 ответов

21 просмотр

больше 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. Немало. Постарайтесь нормализовать максимально изменяемые данные.

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

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

Мужики и девушки, привет) в Вelphi xe7 в настройках во вкладке "Editor Options" далее " Color" есть список: "Elements", открыв который мы можем настраивать отображение разных...
Kraszx
14
Добрый вечер. Есть вопрос, а может и предложение. Был у меня диалог в другой группе о делфи и я задался вопросом: "А нельзя ли в делфи цвет //коментария и {комментария} сде...
Kraszx
24
Всем привет! Подскажи, пожалуйста, как передать в TComboBox сразу значение и id записи. На Delphi я делал так: ComboBox1.Items.AddObject('Какое-то значение', Pointer(id запис...
Евгений
13
А вот это что за конструкция? Вернее, она тут нафига?
Serjone
10
Мдя, прикол, боевая сборка запускается (именно под отладчиком) после F9 примерно полторы минуты (97 секунд если быть точным). Начал копать - проблема детектится сразу - зависа...
Александр (Rouse_) Багель
38
Мужики. привет) в Вelphi xe7 в настройках во вкладке "Editor Options" далее " Color" есть список: "Elements", открыв который мы можем настраивать отображение разных элементов...
Kraszx
2
Здравствуйте, вопрос по структурам данных. Были у вас случаи, когда пришлось писать деревья или двунаправленные списки?
/ /
50
Товарищи, кто работа с iphelper? Или может я в самой логике ошибки фигачу, не пойму.... var ifTable : PMIB_IFTABLE; size, corSize: DWORD; Buffer ...
Warfarellen
4
я так понимаю, я так подозреваю, что создание такого плагина для человека, кто умеет писать плагины для делфи потребует минут 5-10 времени. но это мое подозрение. хотелось бы ...
Kraszx
7
Всем привет! Кто пользуется DevExpress, подскажите пожалуйста, реализован ли в TcxGrid в новых версиях поиск по датам как в Экселе (ну т.е. не просто список чекбоксов со значе...
A Z
4
Карта сайта