ClickHouse: индекс TYPE set(0) — что значит цифра в скобках?
Цифра в скобках в индексе типа set в ClickHouse указывает на параметр «granularity» этого индекса. Этот параметр определяет, с какой частотой будет обновляться индекс и как часто будут записываться данные в индекс.
В случае set(0):
- Цифра 0 указывает, что индекс будет обновляться по одному значению для каждого блока данных.
- Таким образом, индекс будет содержать набор уникальных значений для каждого блока данных, и каждый блок будет иметь свой отдельный индекс.
Пример использования set(0):
|
1 2 3 4 5 6 7 8 9 10 |
CREATE TABLE example_table ( id UInt64, name String, created_at DateTime, amount Float32, INDEX idx_name (name) TYPE set(0) GRANULARITY 4 ) ENGINE = MergeTree() ORDER BY (created_at); |
- В этом примере индекс
idx_nameприменяется к полюname. - Тип индекса —
set(0)— означает, что для каждого блока данных будет храниться набор уникальных значений поляname, и индекс будет обновляться для каждого отдельного значения. GRANULARITY 4означает, что индексация будет происходить каждые 4 строки.
Что такое «granularity»?
Параметр granularity в ClickHouse определяет, как часто создается и обновляется индекс для каждого блока данных:
GRANULARITYуказывает, сколько строк данных будет обработано до того, как индекс будет обновлен.- Например, если у вас GRANULARITY 4, то это означает, что индекс будет создан и обновлен каждые 4 строки.
- Меньшие значения
granularityпозволяют создавать более детализированные индексы, но увеличивают нагрузку на процессор и память. - Большие значения
granularityмогут уменьшить нагрузку на систему, но снизить точность индексации.
Важные моменты:
- Когда вы используете
set(0), это означает, что для каждого блока данных будет храниться полный набор уникальных значений для указанного поля. Это может быть полезно для точных совпадений, таких как запросы типаWHERE name = 'Alice'. - Параметр
granularityпомогает настроить компромисс между производительностью и точностью индексации.
В целом, set(0) используется для обеспечения точности при фильтрации по значениям в поле, и цифра в скобках помогает настроить поведение индекса.
Если вы укажете set(2), то это изменит поведение пропускающего индекса set в ClickHouse, где цифра 2 в скобках указывает на гранулярность индекса.
Как работает set(2)?
- Гранулярность (granularity): Цифра в скобках указывает, сколько строк будет обрабатываться до того, как индекс будет обновлен для этого блока данных.
- В случае
set(2), индекс будет обновляться каждые 2 строки. - То есть, для каждого блока данных (например, если блок содержит несколько тысяч строк), индекс будет хранить уникальные значения для каждого поля в наборе каждые 2 строки.
- Чем меньше значение гранулярности, тем чаще будет обновляться индекс, и тем точнее будут результаты индексации, но это может потребовать больше ресурсов для хранения и обновления индекса.
- В случае
Пример использования:
|
1 2 3 4 5 6 7 8 9 10 |
CREATE TABLE example_table ( id UInt64, name String, created_at DateTime, amount Float32, INDEX idx_name (name) TYPE set(2) GRANULARITY 4 ) ENGINE = MergeTree() ORDER BY (created_at); |
set(2)означает, что индекс для поляnameбудет обновляться каждые 2 строки в блоке данных.GRANULARITY 4указывает, что индекс будет создаваться для каждых 4 строк, т.е. если блок данных содержит 4 строки, то для этих 4 строк будет создан набор уникальных значений для поляname.
Как это влияет на производительность:
- Меньшая гранулярность (например,
set(2)) делает индекс более точным, так как индекс будет содержать более частые обновления. Однако это также может увеличить нагрузку на систему, так как индекс будет обновляться чаще, что потребует дополнительных вычислительных и дисковых ресурсов. - В результате, при
set(2), точность индексации будет выше, но затраты на его поддержку могут увеличиться.
Сравнение с set(0):
set(0): Индекс обновляется для каждого значения в блоке данных (с каждой строкой).set(2): Индекс обновляется каждые 2 строки, что позволяет сохранить немного больше ресурсов по сравнению сset(0), но при этом все равно быть достаточно точным.set(4): Индекс обновляется реже (каждые 4 строки), что снижает точность индексации, но помогает уменьшить ресурсоемкость.
Итог:
set(2)означает, что индекс будет обновляться для каждых 2 строк в блоке данных.- Это предоставляет баланс между точностью индексации и потреблением ресурсов. Если ваши запросы часто фильтруют по конкретным значениям (например, точные совпадения по имени), то такая гранулярность может быть полезной для более эффективного поиска.
- Выбор гранулярности зависит от ваших нужд: если вам нужно быстро обрабатывать множество строк с точными значениями, меньшая гранулярность (например,
set(2)) может быть предпочтительнее, но она потребует больше ресурсов.
Recommended Posts
ClickHouse в вопросах и ответах
28.04.2024
