Одним из ключевых моментов при использовании 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) | |
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) и алгоритмы сжатия будут работать эффективнее.
Аналогично, если ваша система низконагружена и в ней, например, всего по одной записи в секунду, разница по занимаемому на диске пространству может быть минимальной.