> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-postgresql-tls-support.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Выбор ключа партиционирования

> Страница о том, как выбрать ключ партиционирования

export const Image = ({img, alt, size = "lg"}) => {
  const normalizedSize = ["sm", "md", "lg"].includes(size) ? size : "lg";
  return <div className={`ch-image-${normalizedSize}`}>
      <Frame>
        <img src={img} alt={alt} />
      </Frame>
    </div>;
};

<Info>
  **Метод управления данными**

  Партиционирование — это прежде всего метод управления данными, а не инструмент оптимизации запросов. Хотя в отдельных сценариях нагрузки оно может повышать производительность, его не стоит использовать как основной способ ускорения запросов; ключ партиционирования нужно выбирать очень тщательно, ясно понимая все последствия, и применять только тогда, когда это соответствует требованиям жизненного цикла данных или хорошо изученным сценариям доступа.
</Info>

В ClickHouse партиционирование организует данные в логические сегменты на основе заданного ключа. Оно определяется с помощью секции `PARTITION BY` при создании таблицы и обычно используется для группировки строк по временным интервалам, категориям или другим значимым для бизнеса признакам. Каждое уникальное значение выражения партиционирования образует собственную физическую партицию на диске, а ClickHouse хранит данные в отдельных частях для каждого из этих значений. Партиционирование упрощает управление данными, облегчает применение политик хранения и может быть полезно для определённых шаблонов запросов.

Например, рассмотрим следующую таблицу набора данных UK price paid с ключом партиционирования `toStartOfMonth(date)`.

```sql theme={null}
CREATE TABLE uk.uk_price_paid_simple_partitioned
(
  date Date,
  town LowCardinality(String),
  street LowCardinality(String),
  price UInt32
)
ENGINE = MergeTree
ORDER BY (town, street)
PARTITION BY toStartOfMonth(date)
```

Каждый раз, когда в таблицу вставляется набор строк, вместо создания (как [минимум](/ru/reference/settings/session-settings#max_insert_block_size)) одной части данных, содержащей все вставленные строки (как описано [здесь](/ru/concepts/core-concepts/parts)), ClickHouse создает по одной новой части данных для каждого уникального значения ключа партиционирования среди вставленных строк:

<Image img="https://mintcdn.com/private-7c7dfe99-postgresql-tls-support/KEXjaGd0XweSZg01/images/bestpractices/partitions.webp?fit=max&auto=format&n=KEXjaGd0XweSZg01&q=85&s=83e16d070ef0ec16e6c0ef1dbf2c9645" size="lg" alt="Партиции" width="3324" height="2270" data-path="images/bestpractices/partitions.webp" />

Сервер ClickHouse сначала разбивает 4 строки из примера вставки, показанного на диаграмме выше, по значению их ключа партиционирования `toStartOfMonth(date)`. Затем строки в каждой выявленной партиции обрабатываются [обычно](/ru/concepts/core-concepts/parts), проходя несколько последовательных шагов (① Сортировка, ② Разделение на столбцы, ③ Сжатие, ④ Запись на диск).

Более подробное объяснение партиционирования см. в [этом руководстве](/ru/concepts/core-concepts/partitions).

При включенном партиционировании ClickHouse выполняет [слияние](/ru/concepts/core-concepts/merges) частей данных только в пределах партиции, но не между партициями. Ниже это показано на примере таблицы выше:

<Image img="https://mintcdn.com/private-7c7dfe99-postgresql-tls-support/KEXjaGd0XweSZg01/images/bestpractices/merges_with_partitions.webp?fit=max&auto=format&n=KEXjaGd0XweSZg01&q=85&s=d3fefda3f9787d8217355e36922b382d" size="md" alt="Партиции" width="2480" height="1870" data-path="images/bestpractices/merges_with_partitions.webp" />

<div id="applications-of-partitioning">
  ## Применение партиционирования
</div>

Партиционирование — мощный инструмент для управления большими наборами данных в ClickHouse, особенно в сценариях обсервабилити и аналитики. Оно позволяет эффективно выполнять операции по управлению жизненным циклом данных, поскольку целые партиции, часто привязанные ко времени или бизнес-логике, можно удалять, перемещать или архивировать одной операцией с метаданными. Это значительно быстрее и требует меньше ресурсов, чем удаление или копирование на уровне строк. Партиционирование также хорошо интегрируется с такими возможностями ClickHouse, как TTL и многоуровневое хранение, что позволяет реализовать политики хранения данных или стратегии горячего/холодного хранения без дополнительной оркестрации. Например, свежие данные можно хранить на быстром SSD-хранилище, а старые партиции автоматически перемещать в более дешевое объектное хранилище.

Хотя партиционирование может повысить производительность запросов для некоторых рабочих нагрузок, оно также может отрицательно повлиять на время ответа.

Если ключ партиционирования не входит в первичный ключ и вы фильтруете по нему, партиционирование может улучшить производительность запросов. Пример см. [здесь](/ru/concepts/core-concepts/partitions#query-optimization).

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

Итог: партиционирование следует в первую очередь рассматривать как метод управления данными. Пример управления данными см. в ["Managing Data"](/ru/guides/use-cases/observability/build-your-own/managing-data) из руководства по сценариям использования обсервабилити и в ["What are table partitions used for?"](/ru/concepts/core-concepts/partitions#data-management) из Core Concepts - Table partitions.

<div id="choose-a-low-cardinality-partitioning-key">
  ## Выберите ключ партиционирования с низкой мощностью
</div>

Важно понимать, что большое количество частей негативно влияет на производительность запросов. Поэтому ClickHouse будет отвечать на вставки ошибкой [«too many parts»](/ru/resources/support-center/knowledge-base/troubleshooting/exception-too-many-parts), если число частей превысит заданные ограничения — либо [общее](/ru/reference/settings/merge-tree-settings#max_parts_in_total), либо [для одной партиции](/ru/reference/settings/merge-tree-settings#parts_to_throw_insert).

Крайне важно правильно выбрать **мощность** ключа партиционирования. Ключ партиционирования с высокой мощностью — когда число различных значений партиции велико — может привести к быстрому росту количества частей данных. Поскольку ClickHouse не выполняет слияние частей между партициями, слишком большое число партиций приведет к накоплению большого количества неслитых частей, что в итоге вызовет ошибку «Too many parts». [Слияния крайне важны](/ru/concepts/core-concepts/merges) для уменьшения фрагментации хранилища и оптимизации скорости запросов, но при партициях с высокой мощностью эта возможность теряется.

Напротив, **ключ партиционирования с низкой мощностью** — с числом различных значений менее 100–1 000 — обычно является оптимальным. Он обеспечивает эффективное слияние частей, снижает накладные расходы на метаданные и предотвращает чрезмерное создание объектов в хранилище. Кроме того, ClickHouse автоматически создает индексы MinMax для столбцов партиции, что может значительно ускорить запросы с фильтрацией по этим столбцам. Например, фильтрация по месяцу, когда таблица партиционирована по `toStartOfMonth(date)`, позволяет движку полностью пропускать нерелевантные партиции и их части.

Хотя партиционирование может повысить производительность в некоторых сценариях запросов, в первую очередь это средство управления данными. Во многих случаях запросы по всем партициям могут работать медленнее, чем в непартиционированной таблице, из-за большей фрагментации данных и необходимости сканировать больше частей. Используйте партиционирование осмотрительно и всегда следите за тем, чтобы выбранный ключ имел низкую мощность и соответствовал политикам жизненного цикла данных (например, срокам хранения через TTL). Если вы не уверены, нужно ли партиционирование, возможно, стоит начать без него и оптимизировать позже на основе наблюдаемого характера доступа.
