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
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
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)
AUTO 82.9 MB 77.786 MB 41.666 MB
BLOCKDICT_COMP 437.993 MB 390.953 MB 22.167 MB
BLOCK_DICT 329.958 MB 329.958 MB 26.88 MB
BZIP_COMP 152.099 MB 124.857 MB 1.768 MB
COMMONDELTA_COMP 114.521 MB 13.427 MB 0.479 MB
DELTARANGE_COMP 69.383 MB 62.281 MB 1.491 MB
DELTAVAL 124.057 MB 124.062 MB 125.982 MB
GCDDELTA 124.101 MB 75.033 MB 26.264 MB
GZIP_COMP 111.654 MB 96.027 MB 1.504 MB
RLE 207.763 MB 191.337 MB 0.838 MB

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

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

Leave a Reply

Your email address will not be published. Required fields are marked *