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-go лучшие практики
16.04.2024