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

# configurações de sessão optimize_*

> Configurações de sessão do ClickHouse no grupo optimize_* gerado.

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
  }}>Tipo</div>
      <div style={{
    overflowWrap: "anywhere"
  }}>{type}</div>
      <div style={{
    fontWeight: 600,
    opacity: 0.72,
    marginInlineStart: "0.5rem"
  }}>Padrão</div>
      <div style={{
    overflowWrap: "anywhere"
  }}>{default_value}</div>
      {changeable_without_restart && <div style={{
    fontWeight: 600,
    opacity: 0.72,
    marginInlineStart: "0.5rem"
  }}>
          Pode ser alterado sem reiniciar
        </div>}
      {changeable_without_restart && <div style={{
    overflowWrap: "anywhere"
  }}>
          {changeable_without_restart}
        </div>}
    </div>;
};

Essas configurações estão disponíveis em [system.settings](/docs/pt-BR/reference/system-tables/settings) e são autogeradas a partir do [código-fonte](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" />

Elimina agregadores min/max/any/anyLast de chaves de GROUP BY na seção SELECT

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

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

Use [restrições](/docs/pt-BR/reference/statements/create/table#constraints) para adicionar a condição do índice. O padrão é `false`.

Valores possíveis:

* true, false

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

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

Mover operações aritméticas para fora das funções de agregação

<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": "Substitui por um escalar e usa um hash como nome para constantes grandes (o tamanho é estimado pelo comprimento do nome)"}]}]} />

Substitui por um escalar e usa um hash como nome para constantes grandes (o tamanho é estimado pelo comprimento do nome).

Valores possíveis:

* inteiro positivo - comprimento máximo do nome,
* 0 — sempre,
* inteiro negativo - nunca.

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

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

Ativa ou desativa a otimização da contagem do número de linhas em arquivos em diferentes formatos de entrada. Aplica-se às funções de tabela/motores `file`/`s3`/`url`/`hdfs`/`azureBlobStorage`.

Valores possíveis:

* 0 — Otimização desativada.
* 1 — Otimização ativada.

<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": "Reescreve tupleElement(dictGet(..., tuple_of_attrs, ...), N) em uma chamada dictGet de atributo único."}]}]} />

Reescreve `tupleElement(dictGet('dict', ('a', 'b', 'c'), key), 2)` em `dictGet('dict', 'b', key)` para evitar buscar atributos desnecessários do dicionário. Oferece suporte a acesso posicional (`.1`, `.2`, ...) e nomeado (`.b`) e também se aplica a `dictGetOrDefault` quando o argumento padrão é uma tupla constante ou um `tuple(...)` de constantes.

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

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

Habilita a otimização de DISTINCT se algumas colunas do DISTINCT formarem um prefixo da ordenação. Por exemplo, um prefixo da chave de ordenação no MergeTree ou da instrução ORDER BY

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

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

Otimiza consultas `GROUP BY sharding_key`, evitando agregações custosas no servidor iniciador (o que reduz o uso de memória da consulta nesse servidor).

Os seguintes tipos de consultas são suportados (assim como todas as combinações entre eles):

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

Os seguintes tipos de consultas não são suportados (o suporte a alguns deles pode ser adicionado posteriormente):

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

Valores possíveis:

* 0 — Desabilitado.
* 1 — Habilitado.

Veja também:

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

<Note>
  No momento, isso requer `optimize_skip_unused_shards`, porque no futuro essa opção poderá ser habilitada por padrão e só funcionará corretamente se os dados tiverem sido inseridos por uma tabela Distributed, ou seja, se os dados forem distribuídos de acordo com `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": "Nova configuração"}]}]} />

Quando ativado, `OPTIMIZE ... DRY RUN` valida a parte resultante da mesclagem usando `checkDataPart`. Se a verificação falhar, uma exceção é lançada.

<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": "Nova configuração."}]}]} />

Converte expressões como col = '' ou '' = col para empty(col), e col != '' ou '' != col para notEmpty(col),
apenas quando col é do tipo String ou 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": "Otimiza expressões WHERE, PREWHERE, ON, HAVING e QUALIFY extraindo expressões comuns de disjunções de conjunções."}]}, {"id": "row-2","items": [{"label": "24.12"},{"label": "0"},{"label": "Introduz uma configuração para otimizar expressões WHERE, PREWHERE, ON, HAVING e QUALIFY extraindo expressões comuns de disjunções de conjunções."}]}]} />

Permite extrair expressões comuns de disjunções em expressões WHERE, PREWHERE, ON, HAVING e QUALIFY. Uma expressão lógica como `(A AND B) OR (A AND C)` pode ser reescrita como `A AND (B OR C)`, o que pode ajudar a aproveitar:

* índices em expressões de filtro simples
* otimização de CROSS para 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": "Configuração habilitada por padrão"}]}]} />

Habilita ou desabilita a otimização ao transformar algumas funções em leituras de subcolunas. Isso reduz a quantidade de dados lidos.

Estas funções podem ser transformadas:

* [length](/docs/pt-BR/reference/functions/regular-functions/array-functions#length) para ler a subcoluna [size0](/docs/pt-BR/reference/data-types/array#array-size).
* [empty](/docs/pt-BR/reference/functions/regular-functions/array-functions#empty) para ler a subcoluna [size0](/docs/pt-BR/reference/data-types/array#array-size).
* [notEmpty](/docs/pt-BR/reference/functions/regular-functions/array-functions#notEmpty) para ler a subcoluna [size0](/docs/pt-BR/reference/data-types/array#array-size).
* [isNull](/docs/pt-BR/reference/functions/regular-functions/functions-for-nulls#isNull) para ler a subcoluna [null](/docs/pt-BR/reference/data-types/nullable#finding-null).
* [isNotNull](/docs/pt-BR/reference/functions/regular-functions/functions-for-nulls#isNotNull) para ler a subcoluna [null](/docs/pt-BR/reference/data-types/nullable#finding-null).
* [count](/docs/pt-BR/reference/functions/aggregate-functions/count) para ler a subcoluna [null](/docs/pt-BR/reference/data-types/nullable#finding-null).
* [mapKeys](/docs/pt-BR/reference/functions/regular-functions/tuple-map-functions#mapKeys) para ler a subcoluna [keys](/docs/pt-BR/reference/data-types/map#reading-subcolumns-of-map).
* [mapValues](/docs/pt-BR/reference/functions/regular-functions/tuple-map-functions#mapValues) para ler a subcoluna [values](/docs/pt-BR/reference/data-types/map#reading-subcolumns-of-map).

Valores possíveis:

* 0 — Otimização desabilitada.
* 1 — Otimização habilitada.

<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": "Nova configuração"}]}]} />

Evite buscas inversas repetidas no dicionário usando buscas mais rápidas em um conjunto pré-computado de possíveis valores de chave.

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

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

Substitui 'multiIf' por 'if' quando há apenas uma condição.

<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": "Reescrever funções de agregação semanticamente equivalentes a count() como count() por padrão"}]}]} />

Reescrever funções de agregação semanticamente equivalentes a count() como 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": "Ativa a otimização de dados em INSERT por padrão para proporcionar uma melhor experiência ao usuário"}]}]} />

Ativa ou desativa a transformação de dados antes da inserção, como se um merge tivesse sido feito neste bloco (de acordo com o mecanismo de tabela).

Valores possíveis:

* 0 — Desativado.
* 1 — Ativado.

**Exemplo**

A diferença entre ativado e desativado:

Consulta:

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

Resultado:

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

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

Observe que essa configuração influencia o comportamento da [visão materializada](/docs/pt-BR/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": "Nova configuração que habilita uma segunda passagem de promoção de PREWHERE para mesclar à cadeia PREWHERE existente os filtros adicionados acima de uma etapa de leitura MergeTree por otimizações posteriores (pushdown de predicados por meio de JOIN, reescritas de projeção)."}]}]} />

Execute uma segunda passagem de promoção de `PREWHERE` após otimizações posteriores do plano de consulta possivelmente terem
adicionado filtros adicionais acima de uma etapa de leitura `MergeTree` (por exemplo, pushdown de predicados por meio de
`JOIN`, reescritas de projeção). Quando já existe um `PREWHERE`, o novo
filtro é mesclado a ele com `AND`, em vez de permanecer como uma etapa de filtro separada.

<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": "Nova configuração"}]}]} />

Substitui as funções de distância no tipo de dado `QBit` por equivalentes que leem do armazenamento apenas as colunas necessárias para o cálculo.

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

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

Habilita a otimização de [ORDER BY](/docs/pt-BR/reference/statements/select/order-by#optimization-of-data-reading) em consultas [SELECT](/docs/pt-BR/reference/statements/select/index) ao ler dados de tabelas [MergeTree](/docs/pt-BR/reference/engines/table-engines/mergetree-family/mergetree).

Valores possíveis:

* 0 — a otimização de `ORDER BY` está desabilitada.
* 1 — a otimização de `ORDER BY` está habilitada.

**Veja também**

* [Cláusula ORDER BY](/docs/pt-BR/reference/statements/select/order-by#optimization-of-data-reading)

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

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

Se estiver definido como true, respeitará aliases em WHERE/GROUP BY/ORDER BY, o que ajudará na eliminação de partições/no uso de índices secundários/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" />

Otimiza a ordenação com base nas propriedades de ordenação do fluxo de entrada

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

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

Use [restrições](/docs/pt-BR/reference/statements/create/table#constraints) para substituição de colunas. O padrão é `false`.

Valores possíveis:

* 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": "A otimização está pronta para uso em produção"}]}]} />

Permite combinar funções de agregação com o mesmo argumento. Reescreve consultas que contêm pelo menos duas funções de agregação [sum](/docs/pt-BR/reference/functions/aggregate-functions/sum), [count](/docs/pt-BR/reference/functions/aggregate-functions/count) ou [avg](/docs/pt-BR/reference/functions/aggregate-functions/avg) com o mesmo argumento para [sumCount](/docs/pt-BR/reference/functions/aggregate-functions/sumCount).

Valores possíveis:

* 0 — Funções com o mesmo argumento não são combinadas.
* 1 — Funções com o mesmo argumento são combinadas.

**Exemplo**

Consulta:

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

Resultado:

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

Habilita ou desabilita o lançamento de uma exceção se uma consulta [OPTIMIZE](/docs/pt-BR/reference/statements/optimize) não realizar um merge.

Por padrão, `OPTIMIZE` retorna com sucesso mesmo quando não faz nada. Essa configuração permite diferenciar essas situações e obter o motivo na mensagem de exceção.

Valores possíveis:

* 1 — O lançamento de exceção está habilitado.
* 0 — O lançamento de exceção está desabilitado.

<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": "Otimiza predicados Date e DateTime convertendo funções em comparações equivalentes, sem necessidade de conversão (ex.: toYear(col) = 2023 -> col >= '2023-01-01' AND col <= '2023-12-31')"}]}]} />

Otimiza predicados Date e DateTime convertendo funções em comparações equivalentes, sem necessidade de conversão (ex.: `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": "Remove os elementos finais de ORDER BY quando todas as chaves de GROUP BY já estiverem cobertas pelo prefixo de ORDER BY."}]}]} />

Remove os elementos finais de ORDER BY quando todas as chaves de GROUP BY já estiverem cobertas pelo prefixo de ORDER BY.

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

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

Reescreve `uniq` e suas variantes (exceto `uniqUpTo`) como `count` se a subconsulta tiver `distinct` ou uma cláusula `group by`.

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

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

Use [restrições](/docs/pt-BR/reference/statements/create/table#constraints) para otimizar consultas. O padrão é `false`.

Valores possíveis:

* true, false
