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

# настройки сеанса group_by_*

> Настройки сеанса ClickHouse в автоматически созданной группе group_by_*.

export const ExperimentalBadge = () => {
  return <a href="https://clickhouse.com/docs/reference/settings/beta-and-experimental-features#experimental-features" className="experimentalBadge">
            <div className="experimentalIcon">
            <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
                <path strokeWidth="1.25" d="M5.5 2H10.5" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
                <path strokeWidth="1.25" d="M9.50015 2V6.19625L13.4283 12.7425C13.4738 12.8183 13.4985 12.9049 13.4996 12.9934C13.5008 13.0818 13.4785 13.169 13.435 13.246C13.3914 13.323 13.3283 13.3871 13.2519 13.4317C13.1755 13.4764 13.0886 13.4999 13.0002 13.5H3.00015C2.91164 13.5 2.8247 13.4766 2.74822 13.432C2.67174 13.3874 2.60847 13.3233 2.56487 13.2463C2.52126 13.1693 2.49889 13.082 2.50004 12.9935C2.50119 12.905 2.52582 12.8184 2.5714 12.7425L6.50015 6.19625V2" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
                <path strokeWidth="1.25" d="M4.47656 9.56754C5.30344 9.41254 6.47656 9.47942 7.99969 10.25C10.0153 11.2707 11.4216 11.0569 12.2184 10.7282" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
            </svg>
        </div>
            Экспериментальная возможность
        </a>;
};

export const VersionHistory = ({rows = []}) => {
  if (rows.length === 0) {
    return null;
  }
  const headers = ["Версия", "Значение по умолчанию", "Комментарий"];
  const border = "1px solid rgba(128, 128, 128, 0.3)";
  const cell = {
    border,
    padding: "0.25rem 0.5rem",
    textAlign: "start",
    verticalAlign: "top"
  };
  return <details className="not-prose" style={{
    border,
    borderRadius: "0.5rem",
    margin: "0.5rem 0",
    padding: "0.5rem 0.75rem",
    fontSize: "0.8125rem",
    lineHeight: "1.125rem"
  }}>
      <summary style={{
    cursor: "pointer",
    fontWeight: 600,
    opacity: 0.72
  }}>
        История версий
      </summary>
      <table style={{
    borderCollapse: "collapse",
    width: "100%",
    margin: "0.5rem 0 0"
  }}>
        <thead>
          <tr>
            {headers.map(header => <th key={header} style={{
    ...cell,
    fontWeight: 600,
    opacity: 0.72
  }}>
                {header}
              </th>)}
          </tr>
        </thead>
        <tbody>
          {rows.map((row, row_index) => <tr key={row.id ?? row_index}>
              {(row.items ?? []).map((item, item_index) => <td key={item_index} style={{
    ...cell,
    overflowWrap: "anywhere"
  }}>
                  {item?.label}
                </td>)}
            </tr>)}
        </tbody>
      </table>
    </details>;
};

export const SettingsInfoBlock = ({type, default_value, changeable_without_restart}) => {
  return <div className="not-prose" style={{
    display: "flex",
    flexWrap: "wrap",
    alignItems: "baseline",
    columnGap: "0.5rem",
    rowGap: "0.125rem",
    margin: "0.375rem 0",
    fontSize: "0.8125rem",
    lineHeight: "1.125rem"
  }}>
      <div style={{
    fontWeight: 600,
    opacity: 0.72
  }}>Тип</div>
      <div style={{
    overflowWrap: "anywhere"
  }}>{type}</div>
      <div style={{
    fontWeight: 600,
    opacity: 0.72,
    marginInlineStart: "0.5rem"
  }}>По умолчанию</div>
      <div style={{
    overflowWrap: "anywhere"
  }}>{default_value}</div>
      {changeable_without_restart && <div style={{
    fontWeight: 600,
    opacity: 0.72,
    marginInlineStart: "0.5rem"
  }}>
          Изменяется без перезапуска
        </div>}
      {changeable_without_restart && <div style={{
    overflowWrap: "anywhere"
  }}>
          {changeable_without_restart}
        </div>}
    </div>;
};

Эти настройки доступны в [system.settings](/ru/reference/system-tables/settings) и автоматически генерируются на основе [исходного кода](https://github.com/ClickHouse/ClickHouse/blob/master/src/Core/Settings.cpp).

<div id="group_by_overflow_mode">
  ## group\_by\_overflow\_mode
</div>

<SettingsInfoBlock type="OverflowModeGroupBy" default_value="throw" />

Определяет, что происходит, когда число уникальных ключей агрегации превышает лимит:

* `throw`: сгенерировать исключение
* `break`: остановить выполнение запроса и вернуть частичный результат
* `any`: продолжить агрегацию для ключей, попавших в набор, но не добавлять в него новые ключи.

Использование значения `any` позволяет выполнить приблизительный вариант GROUP BY. Качество
этого приближения зависит от статистической природы данных.

<div id="group_by_top_k_optimization_observation_rows">
  ## group\_by\_top\_k\_optimization\_observation\_rows
</div>

<ExperimentalBadge />

<SettingsInfoBlock type="UInt64" default_value="65536" />

<VersionHistory rows={[{"id": "row-1","items": [{"label": "26.8"},{"label": "65536"},{"label": "Новая экспериментальная настройка: количество строк, наблюдаемых каждым потоком агрегации, прежде чем полная куча top-K, не отклонившая ни одной строки, будет признана чистыми накладными расходами и заморожена."}]}]} />

Для `enable_group_by_top_k_optimization`: количество строк, наблюдаемых каждым потоком агрегации перед заморозкой полной кучи top-K, которая пропустила менее 10 % входных строк и вытеснила меньше ключей, чем её вместимость. Замороженная куча означает, что агрегация продолжается так, как если бы оптимизация была отключена.

Фактическое окно как минимум вдвое превышает зарезервированный размер кучи, поэтому куча всегда успевает заполниться до оценки. `0` отключает эту заморозку (куча всё равно замораживается, если граничный набор равных значений разрастается сверх её размера).

Это не влияет на запросы `GROUP BY keys LIMIT K` без `ORDER BY`, для которых заморозка всегда отключена: план такого запроса содержит синтезированную сортировку, которая оправдана лишь пока куча ограничивает хеш-таблицу, поэтому заморозка кучи сделала бы план медленнее, чем без оптимизации.

<div id="group_by_two_level_threshold">
  ## group\_by\_two\_level\_threshold
</div>

<SettingsInfoBlock type="UInt64" default_value="100000" />

При каком количестве ключей начинается двухуровневая агрегация. 0 — порог не задан.

<div id="group_by_two_level_threshold_bytes">
  ## group\_by\_two\_level\_threshold\_bytes
</div>

<SettingsInfoBlock type="UInt64" default_value="50000000" />

Минимальный размер состояния агрегации в байтах, при котором начинает использоваться двухуровневая агрегация. 0 — порог не задан. Двухуровневая агрегация используется, когда срабатывает хотя бы один из порогов.

<div id="group_by_use_nulls">
  ## group\_by\_use\_nulls
</div>

<SettingsInfoBlock type="Bool" default_value="0" />

Изменяет способ обработки типов ключей агрегации в [секции GROUP BY](/ru/reference/statements/select/group-by).
Когда используются спецификаторы `ROLLUP`, `CUBE` или `GROUPING SETS`, некоторые ключи агрегации могут не участвовать в формировании отдельных строк результата.
Столбцы для этих ключей в соответствующих строках заполняются либо значением по умолчанию, либо `NULL` — в зависимости от этой настройки.

Возможные значения:

* 0 — Для заполнения отсутствующих значений используется значение по умолчанию для типа ключа агрегации.
* 1 — ClickHouse выполняет `GROUP BY` в соответствии со стандартом SQL. Типы ключей агрегации преобразуются в [Nullable](/ru/reference/data-types/nullable). Столбцы соответствующих ключей агрегации заполняются значением [NULL](/ru/reference/syntax#null) в строках, где эти ключи не использовались.

См. также:

* [секция GROUP BY](/ru/reference/statements/select/group-by)
