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

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

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

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).

## optimize\_aggregators\_of\_group\_by\_keys

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

Исключает агрегаторы min/max/any/anyLast для ключей GROUP BY в разделе SELECT

## optimize\_append\_index

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

Используйте [ограничения](/ru/reference/statements/create/table#constraints) для добавления условия индекса. Значение по умолчанию — `false`.

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

* true, false

## optimize\_arithmetic\_operations\_in\_aggregate\_functions

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

Вынести арифметические операции из агрегатных функций

## optimize\_const\_name\_size

<SettingsInfoBlock type="Int64" default_value="256" />

<VersionHistory rows={[{"id": "row-1","items": [{"label": "25.11"},{"label": "256"},{"label": "Заменять большими константами на скалярные значения и использовать хеш в качестве имени (размер оценивается по длине имени)"}]}]} />

Заменять большие константы на скалярные значения и использовать хеш в качестве имени (размер оценивается по длине имени).

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

* положительное целое число — максимальная длина имени,
* 0 — всегда,
* отрицательное целое число — никогда.

## optimize\_count\_from\_files

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

Включает или отключает оптимизацию подсчета числа строк в файлах различных входных форматов. Применяется к табличным функциям/движкам `file`/`s3`/`url`/`hdfs`/`azureBlobStorage`.

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

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

## optimize\_dictget\_tuple\_element

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

<VersionHistory rows={[{"id": "row-1","items": [{"label": "26.5"},{"label": "1"},{"label": "Заменяет tupleElement(dictGet(..., tuple_of_attrs, ...), N) на вызов dictGet с одним атрибутом."}]}]} />

Заменяет `tupleElement(dictGet('dict', ('a', 'b', 'c'), key), 2)` на `dictGet('dict', 'b', key)`, чтобы не извлекать лишние атрибуты словаря. Поддерживает позиционный (`.1`, `.2`, ...) и именованный (`.b`) доступ, а также применяется к `dictGetOrDefault`, если аргумент значения по умолчанию — константный кортеж или `tuple(...)` из констант.

## optimize\_distinct\_in\_order

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

Включает оптимизацию DISTINCT, если некоторые столбцы в DISTINCT являются префиксом сортировки. Например, префиксом ключа сортировки в MergeTree или оператора ORDER BY.

## optimize\_distributed\_group\_by\_sharding\_key

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

Оптимизирует запросы `GROUP BY sharding_key`, позволяя избежать затратной агрегации на инициирующем сервере (что уменьшает использование памяти для запроса на инициирующем сервере).

Поддерживаются следующие типы запросов (и любые их комбинации):

* `SELECT DISTINCT [..., ]sharding_key[, ...] FROM dist`
* `SELECT ... FROM dist GROUP BY sharding_key[, ...]`
* `SELECT ... FROM dist GROUP BY sharding_key[, ...] ORDER BY x`
* `SELECT ... FROM dist GROUP BY sharding_key[, ...] LIMIT 1`
* `SELECT ... FROM dist GROUP BY sharding_key[, ...] LIMIT 1 BY x`

Следующие типы запросов не поддерживаются (поддержка некоторых из них может быть добавлена позже):

* `SELECT ... GROUP BY sharding_key[, ...] WITH TOTALS`
* `SELECT ... GROUP BY sharding_key[, ...] WITH ROLLUP`
* `SELECT ... GROUP BY sharding_key[, ...] WITH CUBE`
* `SELECT ... GROUP BY sharding_key[, ...] SETTINGS extremes=1`

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

* 0 — Отключено.
* 1 — Включено.

См. также:

* [distributed\_group\_by\_no\_merge](/ru/reference/settings/session-settings/distributed#distributed_group_by_no_merge)
* [distributed\_push\_down\_limit](/ru/reference/settings/session-settings/distributed#distributed_push_down_limit)
* [optimize\_skip\_unused\_shards](/ru/reference/settings/session-settings/optimize-skip#optimize_skip_unused_shards)

<Note>
  Сейчас требуется `optimize_skip_unused_shards` (это связано с тем, что в будущем данный параметр может быть включен по умолчанию, и корректно он будет работать только в том случае, если данные были вставлены через distributed таблицу, то есть распределены в соответствии с `sharding_key`).
</Note>

## optimize\_dry\_run\_check\_part

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

<VersionHistory rows={[{"id": "row-1","items": [{"label": "26.2"},{"label": "1"},{"label": "Новая настройка"}]}]} />

При включении `OPTIMIZE ... DRY RUN` проверяет получившуюся слитую часть с помощью `checkDataPart`. Если проверка не проходит, генерируется исключение.

## optimize\_empty\_string\_comparisons

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

<VersionHistory rows={[{"id": "row-1","items": [{"label": "25.10"},{"label": "1"},{"label": "Новая настройка."}]}]} />

Преобразует выражения вида col = '' или '' = col в empty(col), а col != '' или '' != col — в notEmpty(col)
только в случаях, когда col имеет тип String или FixedString.

## optimize\_extract\_common\_expressions

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

<VersionHistory rows={[{"id": "row-1","items": [{"label": "25.1"},{"label": "1"},{"label": "Оптимизация выражений WHERE, PREWHERE, ON, HAVING и QUALIFY за счет вынесения общих выражений из дизъюнкций конъюнкций."}]}, {"id": "row-2","items": [{"label": "24.12"},{"label": "0"},{"label": "Добавлена настройка для оптимизации выражений WHERE, PREWHERE, ON, HAVING и QUALIFY за счет вынесения общих выражений из дизъюнкций конъюнкций."}]}]} />

Разрешает выносить общие выражения из дизъюнкций в выражениях WHERE, PREWHERE, ON, HAVING и QUALIFY. Логическое выражение вида `(A AND B) OR (A AND C)` можно переписать как `A AND (B OR C)`, что может помочь использовать:

* индексы в простых выражениях фильтрации
* оптимизацию преобразования CROSS JOIN в INNER JOIN

## optimize\_functions\_to\_subcolumns

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

<VersionHistory rows={[{"id": "row-1","items": [{"label": "24.8"},{"label": "1"},{"label": "Настройка включена по умолчанию"}]}]} />

Включает или отключает оптимизацию, при которой некоторые функции преобразуются в чтение подстолбцов. Это уменьшает объем считываемых данных.

Можно преобразовать следующие функции:

* [length](/ru/reference/functions/regular-functions/array-functions#length) для чтения подстолбца [size0](/ru/reference/data-types/array#array-size).
* [empty](/ru/reference/functions/regular-functions/array-functions#empty) для чтения подстолбца [size0](/ru/reference/data-types/array#array-size).
* [notEmpty](/ru/reference/functions/regular-functions/array-functions#notEmpty) для чтения подстолбца [size0](/ru/reference/data-types/array#array-size).
* [isNull](/ru/reference/functions/regular-functions/functions-for-nulls#isNull) для чтения подстолбца [null](/ru/reference/data-types/nullable#finding-null).
* [isNotNull](/ru/reference/functions/regular-functions/functions-for-nulls#isNotNull) для чтения подстолбца [null](/ru/reference/data-types/nullable#finding-null).
* [count](/ru/reference/functions/aggregate-functions/count) для чтения подстолбца [null](/ru/reference/data-types/nullable#finding-null).
* [mapKeys](/ru/reference/functions/regular-functions/tuple-map-functions#mapKeys) для чтения подстолбца [keys](/ru/reference/data-types/map#reading-subcolumns-of-map).
* [mapValues](/ru/reference/functions/regular-functions/tuple-map-functions#mapValues) для чтения подстолбца [values](/ru/reference/data-types/map#reading-subcolumns-of-map).
* [has](/ru/reference/functions/regular-functions/array-functions#has) и [notHas](/ru/reference/functions/regular-functions/array-functions#notHas) для `Map` для чтения подстолбца [keys](/ru/reference/data-types/map#reading-subcolumns-of-map).
* [mapContainsKeyLike](/ru/reference/functions/regular-functions/tuple-map-functions#mapContainsKeyLike) для чтения подстолбца [keys](/ru/reference/data-types/map#reading-subcolumns-of-map).
* [mapContainsValueLike](/ru/reference/functions/regular-functions/tuple-map-functions#mapContainsValueLike) для чтения подстолбца [values](/ru/reference/data-types/map#reading-subcolumns-of-map).

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

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

## optimize\_inverse\_dictionary\_lookup

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

<VersionHistory rows={[{"id": "row-1","items": [{"label": "25.12"},{"label": "1"},{"label": "Новая настройка"}]}]} />

Позволяет избежать повторных обратных обращений к словарю за счёт более быстрого поиска в предварительно вычисленном наборе возможных значений ключей.

## optimize\_multiif\_to\_if

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

Заменяет 'multiIf' с одним условием на 'if'.

## optimize\_mutations\_with\_partition\_pruning

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

<VersionHistory rows={[{"id": "row-1","items": [{"label": "26.9"},{"label": "1"},{"label": "Новая настройка для автоматического отсечения партиций для мутаций на основе предложения WHERE"}]}]} />

Если включено, ClickHouse автоматически определяет условия по ключу партиционирования в предложении WHERE мутаций `ALTER TABLE UPDATE`/`DELETE` и операторов легковесного `UPDATE`/`DELETE` для таблиц семейства `ReplicatedMergeTree` и обрабатывает только затронутые партиции, а не все партиции.

В настоящее время автоматическое отсечение применяется только к реплицируемым таблицам. Для нереплицируемых таблиц `MergeTree` используйте явное предложение `IN PARTITION`, чтобы ограничить мутацию конкретными партициями.

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

* 0 — Отключено. Мутации и легковесные обновления обрабатывают все партиции.
* 1 — Включено. Мутации и легковесные обновления обрабатывают только партиции, соответствующие условию WHERE.

## optimize\_normalize\_count\_variants

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

<VersionHistory rows={[{"id": "row-1","items": [{"label": "21.3"},{"label": "1"},{"label": "По умолчанию переписывает агрегатные функции, семантически эквивалентные count(), в count()"}]}]} />

Переписывает агрегатные функции, семантически эквивалентные count(), в count().

## optimize\_on\_insert

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

<VersionHistory rows={[{"id": "row-1","items": [{"label": "21.1"},{"label": "1"},{"label": "Включает оптимизацию данных при INSERT по умолчанию для удобства пользователей"}]}]} />

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

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

* 0 — Отключено.
* 1 — Включено.

**Пример**

Разница между включенным и отключенным режимами:

Запрос:

```sql theme={null}
SET optimize_on_insert = 1;

CREATE TABLE test1 (`FirstTable` UInt32) ENGINE = ReplacingMergeTree ORDER BY FirstTable;

INSERT INTO test1 SELECT number % 2 FROM numbers(5);

SELECT * FROM test1;

SET optimize_on_insert = 0;

CREATE TABLE test2 (`SecondTable` UInt32) ENGINE = ReplacingMergeTree ORDER BY SecondTable;

INSERT INTO test2 SELECT number % 2 FROM numbers(5);

SELECT * FROM test2;
```

Результат:

```text theme={null}
┌─FirstTable─┐
│          0 │
│          1 │
└────────────┘

┌─SecondTable─┐
│           0 │
│           0 │
│           0 │
│           1 │
│           1 │
└─────────────┘
```

Обратите внимание, что эта настройка влияет на поведение [Materialized view](/ru/reference/statements/create/view#materialized-view).

## optimize\_prewhere\_after\_pushdown

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

<VersionHistory rows={[{"id": "row-1","items": [{"label": "26.6"},{"label": "0"},{"label": "Новая настройка, включающая второй проход вынесения в PREWHERE, чтобы объединять с существующей цепочкой PREWHERE фильтры, добавленные выше шага чтения MergeTree более поздними оптимизациями (pushdown предикатов через JOIN, переписывание projection)."}]}]} />

Выполняет второй проход вынесения в `PREWHERE` после того, как более поздние оптимизации плана запроса
могли добавить дополнительные фильтры выше шага чтения `MergeTree` (например, pushdown предикатов через
`JOIN`, переписывание projection). Если `PREWHERE` уже есть, новый
фильтр объединяется с ним через `AND`, а не остаётся отдельным шагом фильтрации.

## optimize\_qbit\_distance\_function\_reads

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

<VersionHistory rows={[{"id": "row-1","items": [{"label": "25.10"},{"label": "1"},{"label": "новая настройка"}]}]} />

Заменяет функции расстояния для типа данных `QBit` на эквивалентные, которые считывают из хранилища только столбцы, необходимые для вычисления.

## optimize\_read\_in\_order

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

Включает оптимизацию [ORDER BY](/ru/reference/statements/select/order-by#optimization-of-data-reading) в запросах [SELECT](/ru/reference/statements/select/index) при чтении данных из таблиц [MergeTree](/ru/reference/engines/table-engines/mergetree-family/mergetree).

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

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

**См. также**

* [Предложение ORDER BY](/ru/reference/statements/select/order-by#optimization-of-data-reading)

## optimize\_read\_in\_reverse\_order\_final

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

<VersionHistory rows={[{"id": "row-1","items": [{"label": "26.9"},{"label": "1"},{"label": "Новая настройка, включающая оптимизацию чтения в порядке сортировки при чтении в обратном порядке ключа сортировки с модификатором `FINAL` из таблиц `ReplacingMergeTree`."}]}]} />

Включает чтение данных в обратном порядке ключа сортировки в запросах `SELECT` с модификатором `FINAL` из таблиц [ReplacingMergeTree](/ru/reference/engines/table-engines/mergetree-family/replacingmergetree). Работает, только если также включена настройка [optimize\_read\_in\_order](/ru/reference/settings/session-settings/optimize#optimize_read_in_order).

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

* 0 — Чтение в обратном порядке с `FINAL` отключено.
* 1 — Чтение в обратном порядке с `FINAL` включено.

## optimize\_respect\_aliases

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

Если задано значение true, будут учитываться псевдонимы в WHERE/GROUP BY/ORDER BY, что поможет при отсечении партиций/использовании вторичных индексов/optimize\_aggregation\_in\_order/optimize\_read\_in\_order/optimize\_trivial\_count

## optimize\_sorting\_by\_input\_stream\_properties

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

Оптимизирует сортировку с учетом свойств сортировки входного потока

## optimize\_substitute\_columns

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

Используйте [ограничения](/ru/reference/statements/create/table#constraints) для подстановки столбцов. Значение по умолчанию — `false`.

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

* true, false

## optimize\_syntax\_fuse\_functions

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

<VersionHistory rows={[{"id": "row-1","items": [{"label": "26.3"},{"label": "1"},{"label": "Оптимизация готова к использованию в продакшне"}]}]} />

Включает объединение агрегатных функций с одинаковым аргументом. Переписывает запрос, содержащий как минимум две агрегатные функции [sum](/ru/reference/functions/aggregate-functions/sum), [count](/ru/reference/functions/aggregate-functions/count) или [avg](/ru/reference/functions/aggregate-functions/avg) с одинаковым аргументом, заменяя их на [sumCount](/ru/reference/functions/aggregate-functions/sumCount).

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

* 0 — Функции с одинаковым аргументом не объединяются.
* 1 — Функции с одинаковым аргументом объединяются.

**Пример**

Запрос:

```sql theme={null}
CREATE TABLE fuse_tbl(a Int8, b Int8) Engine = Log;
SET optimize_syntax_fuse_functions = 1;
EXPLAIN SYNTAX run_query_tree_passes = 1 SELECT sum(a), sum(b), count(b), avg(b) from fuse_tbl FORMAT TSVRaw;
```

Результат:

```text theme={null}
SELECT
    sum(__table1.a) AS `sum(a)`,
    tupleElement(sumCount(__table1.b), 1) AS `sum(b)`,
    tupleElement(sumCount(__table1.b), 2) AS `count(b)`,
    divide(tupleElement(sumCount(__table1.b), 1), toFloat64(tupleElement(sumCount(__table1.b), 2))) AS `avg(b)`
FROM default.fuse_tbl AS __table1
```

## optimize\_throw\_if\_noop

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

Включает или отключает генерацию исключения, если запрос [OPTIMIZE](/ru/reference/statements/optimize) не выполнил слияние.

По умолчанию `OPTIMIZE` завершается успешно, даже если фактически ничего не делает. Этот параметр позволяет различать такие ситуации и получать причину в сообщении об исключении.

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

* 1 — Генерация исключения включена.
* 0 — Генерация исключения отключена.

## optimize\_time\_filter\_with\_preimage

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

<VersionHistory rows={[{"id": "row-1","items": [{"label": "24.2"},{"label": "1"},{"label": "Оптимизирует предикаты Date и DateTime, преобразуя функции в эквивалентные сравнения без преобразований (например, toYear(col) = 2023 -> col >= '2023-01-01' AND col <= '2023-12-31')"}]}]} />

Оптимизирует предикаты Date и DateTime, преобразуя функции в эквивалентные сравнения без преобразований (например, `toYear(col) = 2023 -> col >= '2023-01-01' AND col <= '2023-12-31'`)

## optimize\_truncate\_order\_by\_after\_group\_by\_keys

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

<VersionHistory rows={[{"id": "row-1","items": [{"label": "26.4"},{"label": "1"},{"label": "Удалять элементы в конце ORDER BY, когда все ключи GROUP BY уже входят в префикс ORDER BY."}]}]} />

Удалять элементы в конце ORDER BY, когда все ключи GROUP BY уже входят в префикс ORDER BY.

## optimize\_uniq\_to\_count

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

Преобразует uniq и его варианты (кроме uniqUpTo) в count, если подзапрос содержит DISTINCT или предложение GROUP BY.

## optimize\_using\_constraints

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

Используйте [ограничения](/ru/reference/statements/create/table#constraints) для оптимизации запроса. Значение по умолчанию — `false`.

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

* true, false
