> ## Documentation Index
> Fetch the complete documentation index at: https://clickhouse.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

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

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

export const BetaBadge = ({link, galaxyTrack, galaxyEvent}) => {
  if (link) {
    return <a href={link} target="_blank" rel="noopener noreferrer" className="betaBadge" onClick={galaxyTrack && galaxyEvent ? galaxyOnClick(galaxyEvent) : undefined}>
                <span>Бета</span>
            </a>;
  }
  return <a href="https://clickhouse.com/docs/reference/settings/beta-and-experimental-features#beta-features" className="betaBadge">
            <span>Возможность в статусе бета</span>
        </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](/docs/ru/reference/system-tables/settings) и автоматически генерируются на основе [исходного кода](https://github.com/ClickHouse/ClickHouse/blob/master/src/Core/Settings.cpp).

<div id="optimize_trivial_approximate_count_query">
  ## optimize\_trivial\_approximate\_count\_query
</div>

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

Использовать приблизительное значение для оптимизации простого подсчета `count` в хранилищах, поддерживающих такую оценку, например EmbeddedRocksDB.

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

* 0 — Оптимизация отключена.
  * 1 — Оптимизация включена.

<div id="optimize_trivial_count_query">
  ## optimize\_trivial\_count\_query
</div>

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

Включает или отключает оптимизацию тривиального запроса `SELECT count() FROM table` с использованием метаданных MergeTree. Если требуется использовать безопасность на уровне строки, отключите этот параметр.

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

* 0 — Оптимизация отключена.
  * 1 — Оптимизация включена.

См. также:

* [optimize\_functions\_to\_subcolumns](/docs/ru/reference/settings/session-settings/optimize#optimize_functions_to_subcolumns)

<div id="optimize_trivial_count_with_sparsity_filter">
  ## optimize\_trivial\_count\_with\_sparsity\_filter
</div>

<BetaBadge />

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

<VersionHistory rows={[{"id": "row-1","items": [{"label": "26.8"},{"label": "1"},{"label": "Переведён в бета-статус и включён по умолчанию: результат `SELECT count() FROM t WHERE <pred>` берётся из сохраняемых счётчиков `num_defaults` \/ `num_rows` для каждого столбца, когда `<pred>` разделяет строки на значения по умолчанию и все остальные. Требуется настройка MergeTree `compute_exact_num_defaults_for_sparse_columns` (теперь также включена по умолчанию)."}]}, {"id": "row-2","items": [{"label": "26.7"},{"label": "0"},{"label": "Новый (экспериментальный) параметр, позволяющий получать результат `SELECT count() FROM t WHERE <pred>` из счётчиков `num_defaults` \/ `num_rows` для каждого столбца, записанных в `serialization.json`, когда `<pred>` точно разделяет строки на значения по умолчанию и все остальные."}]}]} />

Расширяет оптимизацию [optimize\_trivial\_count\_query](/docs/ru/reference/settings/session-settings/optimize-trivial#optimize_trivial_count_query) на
запросы вида `SELECT count() FROM t WHERE col <op> const`, где `<op> const`
точно разделяет строки на значения по умолчанию и все остальные для `col`. В этом случае результат count
берётся из счётчиков `num_defaults` / `num_rows` для каждого столбца, которые MergeTree уже
хранит в `serialization.json`, без сканирования данных.

Распознаваемые шаблоны:

* `col = default(col)` / `col != default(col)` для `Int*` / `UInt*`, `String` /
  `FixedString`, `Date` / `DateTime` / `DateTime64`, `Decimal*`, `UUID`, `IPv4` / `IPv6`.
* `IS NULL` / `IS NOT NULL` для столбцов `Nullable`.
* `empty(col)` / `notEmpty(col)` для столбцов `String`.
* `col = true` / `col != true` для столбцов `Bool`.
* `col > 0`, `col >= 1`, `col < 1`, `col <= 0` для беззнаковых целочисленных столбцов.
* Просто `col` / `NOT col` для столбцов `Int*`, `UInt*`, `Bool` (проверка на истинность).

Шаблоны равенства не применяются к `Float*`, `Enum*`, `Nullable`, `LowCardinality`
или составным типам (`Tuple`, `Array`, `Map`, ...) — для них count вычисляется по
обычному пути сканирования.

Чтобы это работало, счётчик `num_defaults` для каждой части должен быть точным. Включите настройку таблицы MergeTree
`compute_exact_num_defaults_for_sparse_columns` в целевой таблице до
вставок и слияний. Части, записанные без неё, молча исключаются из rewrite, поэтому
одного включения `optimize_trivial_count_with_sparsity_filter` недостаточно.

Для шаблонов `IS NULL` / `IS NOT NULL` на столбцах `Nullable` у столбца также должна
быть запись `num_defaults` в `serialization.json`, что происходит только когда настройка таблицы MergeTree
`nullable_serialization_version` установлена в `allow_sparse` во время вставки /
слияния. При значении по умолчанию `basic` столбцы `Nullable` не получают записи для каждого столбца, поэтому
оптимизация молча не применяется.

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

* 0 — Оптимизация отключена.
  * 1 — Оптимизация включена.

См. также:

* [optimize\_trivial\_count\_query](/docs/ru/reference/settings/session-settings/optimize-trivial#optimize_trivial_count_query)

<div id="optimize_trivial_group_by_limit_query">
  ## optimize\_trivial\_group\_by\_limit\_query
</div>

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

<VersionHistory rows={[{"id": "row-1","items": [{"label": "26.5"},{"label": "1"},{"label": "Новая настройка, ограничивающая агрегацию не более чем `LIMIT` различными ключами для запросов `SELECT key_expr FROM t GROUP BY key_expr LIMIT n`."}]}]} />

Включает или отключает оптимизацию тривиального запроса `SELECT key_expr FROM table GROUP BY key_expr LIMIT n` (без агрегатных функций в проекции, без секций `HAVING`/`ORDER BY`/`LIMIT BY`/window и без модификаторов `GROUP BY`) за счет установки `max_rows_to_group_by = n + offset` и `group_by_overflow_mode = 'any'`. Агрегация прекращается, как только будет получено `n + offset` различных ключей.

Оптимизация не применяется, если пользователь явно установил для `group_by_overflow_mode` значение, отличное от `any` (чтобы сохранить явно заданное поведение `throw`/`break`), а также если пользователь уже задал более строгое значение `max_rows_to_group_by` (в этом случае оптимизация ничего бы не изменила).

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

* 0 — Оптимизация отключена.
* 1 — Оптимизация включена.

<div id="optimize_trivial_insert_select">
  ## optimize\_trivial\_insert\_select
</div>

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

<VersionHistory rows={[{"id": "row-1","items": [{"label": "24.7"},{"label": "0"},{"label": "Эта оптимизация во многих случаях не имеет смысла."}]}]} />

Оптимизация тривиального запроса 'INSERT INTO table SELECT ... FROM TABLES'

<div id="optimize_trivial_view_pushdown_to_distributed">
  ## optimize\_trivial\_view\_pushdown\_to\_distributed
</div>

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

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

Если включено, для представлений поверх таблиц [Distributed](/docs/ru/reference/engines/table-engines/special/distributed), в списке `SELECT` которых указаны только ссылки на столбцы, `*`
или выражения (без оконных функций и скалярных подзапросов), а также отсутствуют агрегация, группировка, сортировка и JOIN, полный внешний запрос отправляется
на каждый сегмент. Это позволяет сегменту локально применять фильтры и выражения представления, уменьшая объём данных, передаваемых по сети.

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

* 0 — Оптимизация отключена; представления поверх таблиц `Distributed` всегда выполняются на координаторе.
* 1 — Оптимизация включена.
