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

# ajustes de sesión optimize_*

> Ajustes de sesión de ClickHouse en el grupo generado 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
  }}>Tipo</div>
      <div style={{
    overflowWrap: "anywhere"
  }}>{type}</div>
      <div style={{
    fontWeight: 600,
    opacity: 0.72,
    marginInlineStart: "0.5rem"
  }}>Predeterminado</div>
      <div style={{
    overflowWrap: "anywhere"
  }}>{default_value}</div>
      {changeable_without_restart && <div style={{
    fontWeight: 600,
    opacity: 0.72,
    marginInlineStart: "0.5rem"
  }}>
          Modificable sin reiniciar
        </div>}
      {changeable_without_restart && <div style={{
    overflowWrap: "anywhere"
  }}>
          {changeable_without_restart}
        </div>}
    </div>;
};

Estos ajustes están disponibles en [system.settings](/docs/es/reference/system-tables/settings) y se generan automáticamente a partir del [código fuente](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 los agregadores min/max/any/anyLast de las claves de GROUP BY en la cláusula SELECT

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

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

Use [restricciones](/docs/es/reference/statements/create/table#constraints) para añadir la condición del índice. El valor predeterminado es `false`.

Valores posibles:

* true, false

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

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

Saca las operaciones aritméticas de las funciones de agregación

<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": "Sustituir por un escalar y usar un hash como nombre para constantes grandes (el tamaño se estima por la longitud del nombre)"}]}]} />

Sustituir por un escalar y usar un hash como nombre para constantes grandes (el tamaño se estima por la longitud del nombre).

Posibles valores:

* entero positivo - longitud máxima del nombre,
* 0 — siempre,
* entero negativo - nunca.

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

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

Habilita o deshabilita la optimización del conteo de filas en archivos con distintos formatos de entrada. Se aplica a las funciones de tabla/motores `file`/`s3`/`url`/`hdfs`/`azureBlobStorage`.

Valores posibles:

* 0 — Optimización deshabilitada.
* 1 — Optimización habilitada.

<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": "Reescribe tupleElement(dictGet(..., tuple_of_attrs, ...), N) como una llamada a dictGet de un solo atributo."}]}]} />

Reescribe `tupleElement(dictGet('dict', ('a', 'b', 'c'), key), 2)` como `dictGet('dict', 'b', key)` para evitar recuperar atributos del diccionario innecesarios. Admite acceso posicional (`.1`, `.2`, ...) y con nombre (`.b`), y también se aplica a `dictGetOrDefault` cuando el argumento por defecto es una tupla constante o un `tuple(...)` de constantes.

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

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

Habilita la optimización de DISTINCT si algunas de sus columnas forman un prefijo de la ordenación. Por ejemplo, un prefijo de la clave de ordenación en MergeTree o de la instrucción ORDER BY

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

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

Optimiza las consultas `GROUP BY sharding_key` al evitar una agregación costosa en el servidor iniciador (lo que reduce el uso de memoria de la consulta en ese servidor).

Se admiten los siguientes tipos de consultas (y cualquier combinación de ellos):

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

No se admiten los siguientes tipos de consultas (más adelante podría añadirse soporte para algunas de ellas):

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

Posibles valores:

* 0 — Deshabilitado.
* 1 — Habilitado.

Véase también:

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

<Note>
  Actualmente requiere `optimize_skip_unused_shards` (la razón es que, en algún momento, podría habilitarse de forma predeterminada, y solo funcionará correctamente si los datos se insertaron a través de una tabla Distributed; es decir, si los datos se distribuyen según `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": "Nueva opción"}]}]} />

Si está habilitado, `OPTIMIZE ... DRY RUN` valida la parte fusionada resultante con `checkDataPart`. Si la comprobación falla, se lanza una excepción.

<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": "Nueva configuración."}]}]} />

Convierte expresiones como col = '' o '' = col en empty(col), y col != '' o '' != col en notEmpty(col),
únicamente cuando col es de tipo String o 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": "Optimiza las expresiones WHERE, PREWHERE, ON, HAVING y QUALIFY extrayendo las expresiones comunes de una disyunción de conjunciones."}]}, {"id": "row-2","items": [{"label": "24.12"},{"label": "0"},{"label": "Introduce una configuración para optimizar las expresiones WHERE, PREWHERE, ON, HAVING y QUALIFY extrayendo las expresiones comunes de una disyunción de conjunciones."}]}]} />

Permite extraer expresiones comunes de las disyunciones en las expresiones WHERE, PREWHERE, ON, HAVING y QUALIFY. Una expresión lógica como `(A AND B) OR (A AND C)` puede reescribirse como `A AND (B OR C)`, lo que puede ayudar a aprovechar:

* índices en expresiones de filtrado simples
* la optimización de CROSS a 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": "Configuración habilitada de forma predeterminada"}]}]} />

Habilita o deshabilita la optimización mediante la transformación de algunas funciones para que lean subcolumnas. Esto reduce la cantidad de datos que se deben leer.

Estas funciones pueden transformarse:

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

Valores posibles:

* 0 — Optimización deshabilitada.
* 1 — Optimización 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": "Nueva opción"}]}]} />

Evita repetir la búsqueda inversa en diccionarios mediante búsquedas más rápidas en un conjunto precalculado de posibles valores de clave.

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

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

Sustituye 'multiIf' por 'if' cuando solo haya una condición.

<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": "Reescribe de forma predeterminada las funciones de agregación semánticamente equivalentes a count() como count()"}]}]} />

Reescribe las funciones de agregación semánticamente 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": "Habilita la optimización de datos en INSERT de forma predeterminada para mejorar la experiencia del usuario"}]}]} />

Habilita o deshabilita la transformación de datos antes de la inserción, como si se hubiera realizado una fusión en este bloque (según el motor de la tabla).

Posibles valores:

* 0 — Deshabilitado.
* 1 — Habilitado.

**Ejemplo**

La diferencia entre habilitado y deshabilitado:

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 │
└─────────────┘
```

Tenga en cuenta que esta configuración afecta al comportamiento de la [vista materializada](/docs/es/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": "Nueva configuración que habilita una segunda pasada de promoción de PREWHERE para fusionar en la cadena PREWHERE existente los filtros añadidos sobre un paso de lectura de MergeTree por optimizaciones posteriores (pushdown de predicados a través de JOIN, reescrituras de proyección)."}]}]} />

Ejecuta una segunda pasada de promoción de `PREWHERE` después de que optimizaciones posteriores del plan de consulta hayan podido
añadir filtros adicionales sobre un paso de lectura de `MergeTree` (p. ej., pushdown de predicados a través de
`JOIN`, reescrituras de proyección). Cuando ya existe un `PREWHERE`, el nuevo
filtro se fusiona con él mediante `AND` en lugar de permanecer como un paso de filtro independiente.

<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": "Nueva configuración"}]}]} />

Sustituye las funciones de distancia del tipo de dato `QBit` por otras equivalentes que solo leen del almacenamiento las columnas necesarias para el cálculo.

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

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

Habilita la optimización de [ORDER BY](/docs/es/reference/statements/select/order-by#optimization-of-data-reading) en las consultas [SELECT](/docs/es/reference/statements/select/index) para la lectura de datos de tablas [MergeTree](/docs/es/reference/engines/table-engines/mergetree-family/mergetree).

Valores posibles:

* 0 — la optimización de `ORDER BY` está deshabilitada.
* 1 — la optimización de `ORDER BY` está habilitada.

**Véase también**

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

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

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

Si se establece en true, respetará los alias en WHERE/GROUP BY/ORDER BY, lo que ayudará con el descarte de particiones/índices secundarios/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" />

Optimiza la ordenación en función de las propiedades de ordenación del flujo de entrada

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

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

Use [restricciones](/docs/es/reference/statements/create/table#constraints) para sustituir columnas. El valor predeterminado es `false`.

Valores posibles:

* 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": "La optimización está lista para producción"}]}]} />

Permite fusionar funciones de agregación con el mismo argumento. Reescribe una consulta que contiene al menos dos funciones de agregación de [sum](/docs/es/reference/functions/aggregate-functions/sum), [count](/docs/es/reference/functions/aggregate-functions/count) o [avg](/docs/es/reference/functions/aggregate-functions/avg) con el mismo argumento como [sumCount](/docs/es/reference/functions/aggregate-functions/sumCount).

Valores posibles:

* 0 — Las funciones con el mismo argumento no se fusionan.
* 1 — Las funciones con el mismo argumento se fusionan.

**Ejemplo**

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 o deshabilita el lanzamiento de una excepción si una consulta [OPTIMIZE](/docs/es/reference/statements/optimize) no realizó ninguna fusión.

De forma predeterminada, `OPTIMIZE` se completa correctamente incluso si no hizo nada. Esta configuración le permite distinguir estas situaciones y obtener el motivo en el mensaje de excepción.

Valores posibles:

* 1 — El lanzamiento de una excepción está habilitado.
* 0 — El lanzamiento de una excepción está deshabilitado.

<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": "Optimiza los predicados de Date y DateTime convirtiendo las funciones en comparaciones equivalentes sin necesidad de conversiones (p. ej., toYear(col) = 2023 -> col >= '2023-01-01' AND col <= '2023-12-31')"}]}]} />

Optimiza los predicados de Date y DateTime convirtiendo las funciones en comparaciones equivalentes sin necesidad de conversiones (p. ej., `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": "Eliminar los elementos finales de ORDER BY una vez que todas las claves de GROUP BY queden incluidas en el prefijo de ORDER BY."}]}]} />

Eliminar los elementos finales de ORDER BY una vez que todas las claves de GROUP BY queden incluidas en el prefijo de ORDER BY.

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

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

Reescribe uniq y sus variantes (excepto uniqUpTo) como count si la subconsulta tiene DISTINCT o una cláusula GROUP BY.

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

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

Use [restricciones](/docs/es/reference/statements/create/table#constraints) para la optimización de consultas. El valor predeterminado es `false`.

Valores posibles:

* true, false
