ClickHouse: если у нас миллион записей, а в поле может быть только три варианта значений, какую гранулярность для set нужно указывать?
Если у вас миллион записей и в поле может быть только три возможных значения, то использование индекса типа set
в ClickHouse может значительно ускорить запросы с точными совпадениями (например, фильтрация по этому полю). В случае такого небольшого количества уникальных значений (три возможных значения), вам нужно подобрать подходящую гранулярность для индекса, чтобы сбалансировать точность индексации и ресурсоемкость.
Что влияет на выбор гранулярности?
- Гранулярность указывает, сколько строк нужно обработать для создания и обновления индекса. Чем меньше гранулярность, тем более «детализированным» будет индекс, но тем больше ресурсов он будет требовать для обновления.
- Поскольку у вас всего три возможных значения в поле, то индекс будет довольно компактным. Даже при большом объеме данных (миллион записей) индекс будет занимать немного памяти, так как всего три уникальных значения.
- При такой ситуации (несколько уникальных значений), обычно не нужно задавать очень высокую гранулярность. Слишком частое обновление индекса не принесет значительного улучшения производительности, поскольку данные будут сжаты в несколько уникальных категорий.
Рекомендации по выбору гранулярности:
- Если вы хотите сэкономить ресурсы, можно выбрать гранулярность 4 или 8. Это будет достаточным, чтобы ClickHouse эффективно обрабатывал блоки данных, при этом не тратя слишком много ресурсов на создание индекса для каждой строки.
- Если вы хотите, чтобы индекс был как можно более точным и быстрее реагировал на запросы, можно выбрать гранулярность 1 или 2, но в этом случае вы потратите больше ресурсов на поддержание индекса.
Почему именно 4 или 8?
- С гранулярностью 4 или 8 ClickHouse будет обновлять индекс на каждом блоке данных, состоящем из нескольких строк, но не для каждой строки по отдельности. Это достаточно эффективно для данного случая с тремя уникальными значениями.
- Учитывая, что у вас всего три возможных значения в поле, гранулярность 4 или 8 будет вполне подходящей для большинства запросов, поскольку индекс будет компактным, и затраты на его поддержание не будут слишком высокими.
Пример создания индекса set
:
1 2 3 4 5 6 7 8 9 10 |
CREATE TABLE example_table ( id UInt64, category String, -- поле с тремя уникальными значениями created_at DateTime, amount Float32, INDEX idx_category (category) TYPE set(4) GRANULARITY 4 ) ENGINE = MergeTree() ORDER BY (created_at); |
category
— это поле с тремя возможными значениями.- Индекс типа
set(4)
будет обновляться каждые 4 строки, что является хорошим компромиссом между точностью индекса и использованием ресурсов. GRANULARITY 4
говорит, что индекс будет создан каждые 4 строки в блоке данных.
Заключение:
- Для поля с тремя возможными значениями, гранулярность 4 или 8 будет достаточно эффективной. Это обеспечит хорошее соотношение между производительностью и потреблением ресурсов.
- В зависимости от вашей конкретной нагрузки и объема данных, вы можете экспериментировать с меньшими значениями гранулярности, такими как 1 или 2, но в большинстве случаев гранулярность 4-8 даст достаточно хорошую производительность при сохранении разумного использования ресурсов.
Recommended Posts
clickhouse-go лучшие практики
16.04.2024