HP Vertica. Хранение timestamp в зависимости от его точности и Encoding Type.

Одним из ключевых моментов при использовании HP Vertica является оптимизация хранения данных. HP Vertica позволяет использовать кодирование(encoding) данных. Кодирование позволяет снизить количество занимаемого дискового пространства, что позволяет быстрее вычитывать большие объемы данных, декодируя их на лету. HP Vertica позволяет использовать несколько типов кодирования данных(Encoding Type). По умолчанию при создании проекции всегда используется тип кодирования AUTO. Однако, на практике тип кодирования AUTO может оказаться не оптимальным, и нужно будет подобрать другой тип кодирования.

Применимость того или иного типа кодирования данных определяется типом данных столбца и мощностью(cardinality) множества данных в столбце. Также немаловажным является фактор ресурсоемкости алгоритма кодирования.

В этой статье я исследую сколько дискового пространства будут занимать данные с типом timestamp в зависимости от его точности и от типа кодирования.

Исходная выборка представлена текстовым файлом. В файле содержится 43195502 строк в формате timestamp с точностью до микросекунд(6 знаков после запятой) в диапазоне от «18.11.15 00:00:00» до «18.11.15 23:59:59», т.е. за один день. Выборка сгенерирована так, что для каждой миллисекунды в этом диапазоне с вероятностью 50% есть запись, что составляет примерно 500 записей в секунду.

"18.11.15 00:00:00,001261"
"18.11.15 00:00:00,002797"
"18.11.15 00:00:00,004778"
"18.11.15 00:00:00,005283"
...
"18.11.15 23:59:59,995350"
"18.11.15 23:59:59,999563"

Для исследования было создано множество таблиц с единственной колонкой типа timestamp с точностью 0, 3, 6 и с различными типами кодирования.

create table test_ts_AUTO(t timestamp encoding AUTO) order by t;
create table test_ts_BLOCK_DICT(t timestamp encoding BLOCK_DICT) order by t;
create table test_ts_BLOCKDICT_COMP(t timestamp encoding BLOCKDICT_COMP) order by t;
create table test_ts_BZIP_COMP(t timestamp encoding BZIP_COMP) order by t;
create table test_ts_COMMONDELTA_COMP(t timestamp encoding COMMONDELTA_COMP) order by t;
create table test_ts_DELTARANGE_COMP(t timestamp encoding DELTARANGE_COMP) order by t;
create table test_ts_DELTAVAL(t timestamp encoding DELTAVAL) order by t;
create table test_ts_GCDDELTA(t timestamp encoding GCDDELTA) order by t;
create table test_ts_GZIP_COMP(t timestamp encoding GZIP_COMP) order by t;
create table test_ts_RLE(t timestamp encoding RLE) order by t;

create table test_ts3_AUTO(t timestamp(3) encoding AUTO) order by t;
create table test_ts3_BLOCK_DICT(t timestamp(3) encoding BLOCK_DICT) order by t;
create table test_ts3_BLOCKDICT_COMP(t timestamp(3) encoding BLOCKDICT_COMP) order by t;
create table test_ts3_BZIP_COMP(t timestamp(3) encoding BZIP_COMP) order by t;
create table test_ts3_COMMONDELTA_COMP(t timestamp(3) encoding COMMONDELTA_COMP) order by t;
create table test_ts3_DELTARANGE_COMP(t timestamp(3) encoding DELTARANGE_COMP) order by t;
create table test_ts3_DELTAVAL(t timestamp(3) encoding DELTAVAL) order by t;
create table test_ts3_GCDDELTA(t timestamp(3) encoding GCDDELTA) order by t;
create table test_ts3_GZIP_COMP(t timestamp(3) encoding GZIP_COMP) order by t;
create table test_ts3_RLE(t timestamp(3) encoding RLE) order by t;

create table test_ts0_AUTO(t timestamp(0) encoding AUTO) order by t;
create table test_ts0_BLOCK_DICT(t timestamp(0) encoding BLOCK_DICT) order by t;
create table test_ts0_BLOCKDICT_COMP(t timestamp(0) encoding BLOCKDICT_COMP) order by t;
create table test_ts0_BZIP_COMP(t timestamp(0) encoding BZIP_COMP) order by t;
create table test_ts0_COMMONDELTA_COMP(t timestamp(0) encoding COMMONDELTA_COMP) order by t;
create table test_ts0_DELTARANGE_COMP(t timestamp(0) encoding DELTARANGE_COMP) order by t;
create table test_ts0_DELTAVAL(t timestamp(0) encoding DELTAVAL) order by t;
create table test_ts0_GCDDELTA(t timestamp(0) encoding GCDDELTA) order by t;
create table test_ts0_GZIP_COMP(t timestamp(0) encoding GZIP_COMP) order by t;
create table test_ts0_RLE(t timestamp(0) encoding RLE) order by t;

Данные были вставлены из внешней(external) таблицы, являющейся представлением данных из исходного файла.

insert into test_ts_AUTO select t from original;
insert into test_ts_BLOCK_DICT select t from original;
insert into test_ts_BLOCKDICT_COMP select t from original;
insert into test_ts_BZIP_COMP select t from original;
insert into test_ts_COMMONDELTA_COMP select t from original;
insert into test_ts_DELTARANGE_COMP select t from original;
insert into test_ts_DELTAVAL select t from original;
insert into test_ts_GCDDELTA select t from original;
insert into test_ts_GZIP_COMP select t from original;
insert into test_ts_RLE select t from original;

insert into test_ts3_AUTO select t from original;
insert into test_ts3_BLOCK_DICT select t from original;
insert into test_ts3_BLOCKDICT_COMP select t from original;
insert into test_ts3_BZIP_COMP select t from original;
insert into test_ts3_COMMONDELTA_COMP select t from original;
insert into test_ts3_DELTARANGE_COMP select t from original;
insert into test_ts3_DELTAVAL select t from original;
insert into test_ts3_GCDDELTA select t from original;
insert into test_ts3_GZIP_COMP select t from original;
insert into test_ts3_RLE select t from original;

insert into test_ts0_AUTO select t from original;
insert into test_ts0_BLOCK_DICT select t from original;
insert into test_ts0_BLOCKDICT_COMP select t from original;
insert into test_ts0_BZIP_COMP select t from original;
insert into test_ts0_COMMONDELTA_COMP select t from original;
insert into test_ts0_DELTARANGE_COMP select t from original;
insert into test_ts0_DELTAVAL select t from original;
insert into test_ts0_GCDDELTA select t from original;
insert into test_ts0_GZIP_COMP select t from original;
insert into test_ts0_RLE select t from original;

Итоговая таблица по занимаемому дисковому пространству:

 timestamp(6)timestamp(3)timestamp(0)
AUTO82.9 MB77.786 MB41.666 MB
BLOCKDICT_COMP437.993 MB390.953 MB22.167 MB
BLOCK_DICT329.958 MB329.958 MB26.88 MB
BZIP_COMP152.099 MB124.857 MB1.768 MB
COMMONDELTA_COMP114.521 MB13.427 MB0.479 MB
DELTARANGE_COMP69.383 MB62.281 MB1.491 MB
DELTAVAL124.057 MB124.062 MB125.982 MB
GCDDELTA124.101 MB75.033 MB26.264 MB
GZIP_COMP111.654 MB96.027 MB1.504 MB
RLE207.763 MB191.337 MB0.838 MB

Очевидно, что при выборе типа кодирования для оптимального хранения данных типа timestamp, важна точность timestamp.
При хранении timestamp с точностью до секунд в качестве лидеров можно выделить COMMONDELTA_COMP и RLE.
При хранении timestamp с точностью до миллисекунд однозначный лидер COMMONDELTA_COMP.
При хранении timestamp с точностью до микросекунд лидеры DELTARANGE_COMP и AUTO.

ВАЖНО! Всегда принимайте во внимание мощность множества данных колонки. В данной статье рассмотрен пример, в котором на одну секунду приходится примерно 500 строк данных. Если ваша система более нагружена(например, в 10 раз), разрыв по занимаемому на диске пространству между данными с точностью до секунд и до миллисекунд сократится, за счет того что на одну миллисекунду будет приходиться больше записей(5) и алгоритмы сжатия будут работать эффективнее.

Аналогично, если ваша система низконагружена и в ней, например, всего по одной записи в секунду, разница по занимаемому на диске пространству может быть минимальной.

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *