День добрый!
Благодаря одному расширению и его написавшему Александру Алексееву, есть такой тип ZSON в postgres, который создаёт словарик на основе некоторой выборки данных и подменяет в вашем JSONB все словарные слова на 2 байтика (dict_id, word_id).
Выглядит всё хорошо, вот только мои таблицы, в которых немало повторяющихся ключей, занесённых в словарик, не жмутся, а некоторые даже становятся больше.
Вопрос 1: почему так происходит?
Вопрос 2: почему представленный в примере ratio в 40% у меня по результатам превращается всего лишь в 80%? (https://github.com/postgrespro/zson/blob/master/docs/benchmark.md)
Пример:
Postgres 11, в таблице 2 млн записей, средний размер записи около 1 Кб (автосжатия по сути нет), всего таблица весит 2 Гб.
Пример JSONB записи:
{"db": "cup", "rows": 17080015, "latch": 0, "scans": 10, "allocs": 11, "ghosts": 1485, "ind_id": 2, "merges": 0, "obj_id": 500769437, "deletes": 0, "inserts": 44, "lookups": 0, "scans_u": 0, "seeks_u": 10, "updates": 0, "escalate": 0, "ind_name": "InfoRg6025ByProperty7735_RR", "io_latch": 10, "latch_ms": 0, "lob_used": 0, "obj_name": "InfoRg6025", "rowlock": 98, "row_wait": 0, "size_inc": 128, "lob_fetch": 0, "lookups_u": 0, "page_lock": 49, "page_wait": 0, "partition": 1, "size_used": 739352, "updates_u": 56, "io_latch_ms": 5, "row_wait_ms": 0, "escalate_try": 0, "lob_reserved": 0, "page_wait_ms": 0, "size_reserved": 739400}
Инфа от ZSON:
zson version = 0, dict version = 1, jsonb size = 930, zson size (without pglz compression) = 905 (97.31%)
При этом каждый ключ из записи занесён в словарь. По сути если все ключи заменить на двух-байтные значения, то выигрыш должен быть порядка 250 байт, а он лишь 25 байт.
Почему? Какие-то внутренние структуры ZSON'а добавляются дополнительно в поле, которые съедают порядка 200 байт и в итоге на таких относительно маленьких записях нет выигрыша?