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
Данные были вставлены из внешней(external) таблицы, являющейся представлением данных из исходного файла.
Insert
Итоговая таблица по занимаемому дисковому пространству:
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 *