Я использую postgreSQL 9.6 и несколько раз обновляю столбец jsonb с помощью функции jsonb_set()
.
Проблема, с которой я сталкиваюсь, заключается в том, что после каждого обновления дисковое пространство, используемое таблицей, растет в геометрической прогрессиидаже до 10 ГБ для одной строки.
После полного вакуума на столе дисковое пространство уменьшается до нескольких мегабайт.
Есть ли какое-либо решение или лучший подход к этой проблеме?
Я уже пытался создать меньше ключей json и вставить все в значение массива json
UPDATE foo SET test_column = jsonb_set(test_column , '{"$key_name"}', '"$json_value"');
Обновление:
Спасибо за ваши комментарии, я получил некоторые обновления:
Я обнаружил, что если json содержит url в качестве значения поля, пространство увеличивается в геометрической прогрессии. удаление ссылки в json частично решает проблему, и автоочистка работает лучше (я настроил ее более частый запуск на столе). Это пример json:
{"15": [{"type": "Image", "order": "001", "assetId": "242753", "properties": {}, "publicLink": "http://www.yyy.com/232f3.jpg", "firstExport": false}], "20": [{"type": "Image", "order": "001", "assetId": "290818", "properties": {}, "publicLink": "http://www.yyy.com/8826d.jpg", "firstExport": false}]}
, когда этот json достигает 2000 ключей, табличное пространство составляет около 160 МБ, а автоочистка ничего не очищает. Ручной запуск полного вакуума уменьшает пространство до 8000 КБ
Тот же самый json, с 2000 клавишами, но без URL-адресов внутри, занимает всего 30 МБ, и кажется, что автоматический вакуум работает нормально.