> ## 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_*

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

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_aggregators_of_group_by_keys">
  ## optimize\_aggregators\_of\_group\_by\_keys
</div>

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

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

<div id="optimize_append_index">
  ## optimize\_append\_index
</div>

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

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

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

* true, false

<div id="optimize_arithmetic_operations_in_aggregate_functions">
  ## optimize\_arithmetic\_operations\_in\_aggregate\_functions
</div>

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

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

<div id="optimize_const_name_size">
  ## optimize\_const\_name\_size
</div>

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

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

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

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

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

<div id="optimize_count_from_files">
  ## optimize\_count\_from\_files
</div>

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

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

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

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

<div id="optimize_dictget_tuple_element">
  ## optimize\_dictget\_tuple\_element
</div>

<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(...)` из констант.

<div id="optimize_distinct_in_order">
  ## optimize\_distinct\_in\_order
</div>

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

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

<div id="optimize_distributed_group_by_sharding_key">
  ## optimize\_distributed\_group\_by\_sharding\_key
</div>

<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](/docs/ru/reference/settings/session-settings/distributed#distributed_group_by_no_merge)
* [distributed\_push\_down\_limit](/docs/ru/reference/settings/session-settings/distributed#distributed_push_down_limit)
* [optimize\_skip\_unused\_shards](/docs/ru/reference/settings/session-settings/optimize-skip#optimize_skip_unused_shards)

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

<div id="optimize_dry_run_check_part">
  ## optimize\_dry\_run\_check\_part
</div>

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

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

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

<div id="optimize_empty_string_comparisons">
  ## optimize\_empty\_string\_comparisons
</div>

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

<div id="optimize_extract_common_expressions">
  ## optimize\_extract\_common\_expressions
</div>

<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

<div id="optimize_functions_to_subcolumns">
  ## optimize\_functions\_to\_subcolumns
</div>

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

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

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

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

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

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

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

<div id="optimize_inverse_dictionary_lookup">
  ## optimize\_inverse\_dictionary\_lookup
</div>

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

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

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

<div id="optimize_multiif_to_if">
  ## optimize\_multiif\_to\_if
</div>

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

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

<div id="optimize_normalize_count_variants">
  ## optimize\_normalize\_count\_variants
</div>

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

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

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

<div id="optimize_on_insert">
  ## optimize\_on\_insert
</div>

<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](/docs/ru/reference/statements/create/view#materialized-view).

<div id="optimize_prewhere_after_pushdown">
  ## optimize\_prewhere\_after\_pushdown
</div>

<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`, а не остаётся отдельным шагом фильтрации.

<div id="optimize_qbit_distance_function_reads">
  ## optimize\_qbit\_distance\_function\_reads
</div>

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

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

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

<div id="optimize_read_in_order">
  ## optimize\_read\_in\_order
</div>

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

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

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

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

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

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

<div id="optimize_respect_aliases">
  ## optimize\_respect\_aliases
</div>

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

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

<div id="optimize_sorting_by_input_stream_properties">
  ## optimize\_sorting\_by\_input\_stream\_properties
</div>

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

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

<div id="optimize_substitute_columns">
  ## optimize\_substitute\_columns
</div>

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

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

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

* true, false

<div id="optimize_syntax_fuse_functions">
  ## optimize\_syntax\_fuse\_functions
</div>

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

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

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

Результат:

```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
```

<div id="optimize_throw_if_noop">
  ## optimize\_throw\_if\_noop
</div>

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

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

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

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

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

<div id="optimize_time_filter_with_preimage">
  ## optimize\_time\_filter\_with\_preimage
</div>

<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'`)

<div id="optimize_truncate_order_by_after_group_by_keys">
  ## optimize\_truncate\_order\_by\_after\_group\_by\_keys
</div>

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

<div id="optimize_uniq_to_count">
  ## optimize\_uniq\_to\_count
</div>

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

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

<div id="optimize_using_constraints">
  ## optimize\_using\_constraints
</div>

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

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

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

* true, false
