Перейти к основному содержимому
Перейти к основному содержимому

Эффективность хранения временных рядов

После изучения того, как запрашивать наш набор данных со статистикой Википедии, давайте сосредоточимся на оптимизации эффективности его хранения в ClickHouse.
Этот раздел демонстрирует практические методы уменьшения требований к хранению при сохранении производительности запросов.

Оптимизация типов

Общий подход к оптимизации эффективности хранения заключается в использовании оптимальных типов данных.
Посмотрим на колонки project и subproject. Эти колонки имеют тип String, но содержат относительно небольшое количество уникальных значений:

Это означает, что мы можем использовать тип данных LowCardinality(), который использует кодирование на основе словаря. Это позволяет ClickHouse хранить внутренний ID значения вместо оригинального строкового значения, что, в свою очередь, экономит много места:

Мы также использовали тип UInt64 для колонки hits, который занимает 8 байт, но имеет относительно небольшое максимальное значение:

С учетом этого значения мы можем использовать UInt32 вместо этого, который занимает только 4 байта и позволяет хранить максимум до ~4b:

Это уменьшит размер этой колонки в памяти как минимум в 2 раза. Обратите внимание, что размер на диске останется неизменным из-за сжатия. Но будьте осторожны, выбирайте типы данных, которые не слишком малы!

Специальные кодеки

Когда мы имеем дело с последовательными данными, такими как временные ряды, мы можем дополнительно улучшить эффективность хранения, используя специальные кодеки.
Общая идея заключается в том, чтобы хранить изменения между значениями вместо абсолютных значений, что приводит к значительно меньшему объему занимаемого места при работе с медленно изменяющимися данными:

Мы использовали кодек Delta для колонки времени, который хорошо подходит для данных временных рядов.

Правильный ключ сортировки также может сэкономить дисковое пространство.
Поскольку мы обычно хотим фильтровать по пути, мы добавим path в ключ сортировки.
Это требует воссоздания таблицы.

Ниже мы можем увидеть команду CREATE для нашей первоначальной таблицы и оптимизированной таблицы:

И давайте взглянем на объем пространства, занимаемого данными в каждой таблице:

Оптимизированная таблица занимает в своем сжатом виде чуть более чем в 4 раза меньше места.