- PVSM.RU - https://www.pvsm.ru -
Недавно мы выложили на GitHub ZSON [1]. ZSON — это расширение к PostgreSQL для прозрачного сжатия JSONB-документов. Сжатие осуществляется путем выделения строк, наиболее часто встречающихся в ваших документах, и построения словаря с этими строками. Притом строки могут быть не только ключами документа, но и значениями или, например, строками из вложенных массивов. В некоторых случаях ZSON позволяет уменьшить размер базы до двух раз и увеличить количество транзакций в секунду на 10%. В shared buffers документы хранятся в сжатом виде, за счет чего память тоже экономится.
Интересно? Читайте дальше, и вы узнаете, как пользоваться всем этим хозяйством на практике.
Прежде, чем перейти к основному содержимому статьи, хочется отметить несколько моментов:
Сборка ZSON из исходников и его установка осуществляются так:
git clone https://github.com/afiskon/zson.git
cd zson
sudo make install
После установки прогоните тесты:
make installcheck
Включите ZSON для вашей базы данных:
create extension zson;
Поздравляю, ZSON установлен!
Когда и если вы захотите удалить ZSON, просто выключите его:
drop extension zson;
А затем совсем выпилите из PostgreSQL:
sudo make uninstall
Все созданные ZSON'ом типы, таблицы и так далее, будут вычищены автоматически.
Первым делом вы должны обучить ZSON на ваших типичных документах. В результате обучения строится словарь с наиболее часто встречающимися в ваших документах строками, который потом используется для сжатия. Обучение происходит с помощью следующей процедуры:
zson_learn(
tables_and_columns text[][],
max_examples int default 10000,
min_length int default 2,
max_length int default 128,
min_count int default 2
)
Например:
select zson_learn('{{"table1", "row1"}, {"table2", "row2"}}');
Посмотреть получившийся в итоге словарь можно так:
select * from zson_dict;
Теперь вы можете использовать ZSON, как прозрачную замену типа JSONB:
zson_test=# create table zson_example(x zson);
CREATE TABLE
zson_test=# insert into zson_example values ('{"aaa": 123}');
INSERT 0 1
zson_test=# select x -> 'aaa' from zson_example;
-[ RECORD 1 ]-
?column? | 123
Все операторы и процедуры будут работать с ZSON точно так же, как и с JSONB.
По мере изменения схемы ваших документов сжатие может стать неэффективным из-за исчезновения одних строк и появления других. В этом случае вы можете переобучить ZSON на новых данных:
select zson_learn('{{"table1", "row1"}, {"table2", "row2"}}');
При этом создается новая версия словаря. При обновлении и создании новых документов они будут сжиматься с его помощью. Старые документы будут разжиматься с помощью той версии словаря, с которой они были сжаты. Обратите внимание, что словари кэшируются в памяти. Поэтому ZSON узнает о новом словаре не сразу, а спустя примерно минуту после его создания.
Определить, с помощью какой версии словаря был сжат конкретный документ, можно при помощи процедуры zson_info:
zson_test=# select zson_info(x) from test_compress where id = 1;
-[ RECORD 1 ]---------------------------------------------------
zson_info | zson version = 0, dict version = 1, ...
zson_test=# select zson_info(x) from test_compress where id = 2;
-[ RECORD 1 ]---------------------------------------------------
zson_info | zson version = 0, dict version = 0, ...
Если вы абсолютно уверены, что все документы в вашей базе сжаты с помощью новой версии словаря, вы можете безопасно удалить старый словарь:
delete from zson_dict where dict_id = 0;
На практике, впрочем, в этом мало смысла. Вы сэкономите лишь пару килобайт места на диске. Параноик внутри меня считает, что риск потерять данные из-за маааленькой невнимательности того не стоит.
К сожалению, трудно рекомендовать универсальный подход. Например, вы можете время от времени проверять средний размер документа в вашей базе:
select pg_table_size('tt') / (select count(*) from tt)
Если он стал увеличиваться, значит пришло время обновиться словарь. Еще можно переучивать ZSON просто время от времени, например, раз в год.
Наконец, разработчики приложения сами знают, когда они сильно меняют схему документов. Можно включить переобучение ZSON в миграционные скрипты или инструкцию по обновлению приложения.
При сильном желании можно придумать и другие подходы. В общем, все сильно зависит от ситуации.
Как видите, благодаря ZSON вы получаете лучшее из двух миров — гибкость schemaless данных, совмещенную с компактностью реляционной модели. При этом на стороне приложения вообще ничего не нужно делать, все происходит прозрачно, на стороне самой СУБД.
Если у вас есть вопросы, я буду рад ответить на них в комментариях. Любой фидбек, а также pull requests горячо приветствуются.
Автор: Postgres Professional
Источник [5]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/postgresql/196737
Ссылки в тексте:
[1] ZSON: https://github.com/afiskon/zson
[2] ознакомиться с ним здесь: https://github.com/afiskon/zson/blob/master/docs/benchmark.md
[3] Не верьте синтетическим бенчмаркам: http://eax.me/benchmarks/
[4] ознакомиться с отдельной статьей по данной теме: http://eax.me/postgresql-extensions/
[5] Источник: https://habrahabr.ru/post/312006/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best
Нажмите здесь для печати.