Эффективность хранения временных рядов
После изучения того, как запрашивать набор данных статистики Википедии, давайте сосредоточимся на оптимизации его эффективности хранения в ClickHouse. В этом разделе представлены практические методы сокращения требований к хранению при сохранении производительности запросов.
Оптимизация типов
Общий подход к оптимизации эффективности хранения заключается в использовании оптимальных типов данных.
Рассмотрим столбцы project
и subproject
. Эти столбцы имеют тип String, но содержат относительно небольшое количество уникальных значений:
Это значит, что мы можем использовать тип данных LowCardinality(), который использует кодирование на основе словаря. Это позволяет ClickHouse хранить внутренний идентификатор значения вместо оригинального строкового значения, что в свою очередь экономит много места:
Мы также использовали тип UInt64 для столбца hits, который занимает 8 байт, но имеет относительно небольшое максимальное значение:
Учитывая это значение, мы можем вместо этого использовать UInt32, который занимает всего 4 байта и позволяет хранить максимальное значение до ~4b:
Это уменьшит размер этого столбца в памяти как минимум в 2 раза. Обратите внимание, что размер на диске останется неизменным из-за сжатия. Но будьте осторожны, выбирайте типы данных, которые не слишком малы!
Специальные кодеки
Когда мы имеем дело с последовательными данными, такими как временные ряды, мы можем дополнительно улучшить эффективность хранения, используя специальные кодеки. Общая идея заключается в том, чтобы хранить изменения между значениями вместо самих абсолютных значений, что значительно экономит место при работе с медленно изменяющимися данными:
Мы использовали кодек Delta для столбца времени, который хорошо подходит для данных временных рядов.
Правильный ключ сортировки также может сэкономить место на диске.
Поскольку мы обычно хотим фильтровать по пути, мы добавим path
в ключ сортировки.
Для этого необходимо пересоздать таблицу.
Ниже мы можем увидеть команду CREATE
для нашей исходной таблицы и оптимизированной таблицы:
И давайте взглянем на объем занимаемого пространства данными в каждой таблице:
Оптимизированная таблица занимает более чем в 4 раза меньше места в сжатом виде.