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

# paramètres de session optimize_*

> Paramètres de session ClickHouse du groupe généré 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
  }}>Type</div>
      <div style={{
    overflowWrap: "anywhere"
  }}>{type}</div>
      <div style={{
    fontWeight: 600,
    opacity: 0.72,
    marginInlineStart: "0.5rem"
  }}>Par défaut</div>
      <div style={{
    overflowWrap: "anywhere"
  }}>{default_value}</div>
      {changeable_without_restart && <div style={{
    fontWeight: 600,
    opacity: 0.72,
    marginInlineStart: "0.5rem"
  }}>
          Modifiable sans redémarrage
        </div>}
      {changeable_without_restart && <div style={{
    overflowWrap: "anywhere"
  }}>
          {changeable_without_restart}
        </div>}
    </div>;
};

Ces paramètres sont disponibles dans [system.settings](/docs/fr/reference/system-tables/settings) et sont générés automatiquement à partir du [code source](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" />

Élimine les agrégateurs min/max/any/anyLast des clés de GROUP BY dans la clause SELECT

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

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

Utilisez les [contraintes](/docs/fr/reference/statements/create/table#constraints) pour ajouter une condition d’index. La valeur par défaut est `false`.

Valeurs possibles :

* true, false

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

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

Extraire les opérations arithmétiques des fonctions d’agrégation

<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": "Remplace les grandes constantes par un scalaire et utilise un hachage comme nom (la taille est estimée d'après la longueur du nom)"}]}]} />

Remplace les grandes constantes par un scalaire et utilise un hachage comme nom (la taille est estimée d'après la longueur du nom).

Valeurs possibles :

* entier positif - longueur maximale du nom,
* 0 — toujours,
* entier négatif - jamais.

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

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

Active ou désactive l’optimisation du comptage du nombre de lignes dans des fichiers de différents formats d’entrée. Elle s’applique aux fonctions de table/moteurs `file`/`s3`/`url`/`hdfs`/`azureBlobStorage`.

Valeurs possibles :

* 0 — Optimisation désactivée.
* 1 — Optimisation activée.

<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": "Réécrit tupleElement(dictGet(..., tuple_of_attrs, ...), N) en un appel unique à dictGet sur un seul attribut."}]}]} />

Réécrit `tupleElement(dictGet('dict', ('a', 'b', 'c'), key), 2)` en `dictGet('dict', 'b', key)` afin d'éviter de récupérer des attributs de dictionnaire inutiles. Prend en charge l'accès positionnel (`.1`, `.2`, ...) et nommé (`.b`), et s'applique également à `dictGetOrDefault` lorsque l'argument par défaut est un tuple constant ou un `tuple(...)` de constantes.

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

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

Active l’optimisation de DISTINCT si certaines colonnes de DISTINCT constituent un préfixe du tri. Par exemple, un préfixe de la clé de tri dans MergeTree ou de l’instruction ORDER BY

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

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

Optimise les requêtes `GROUP BY sharding_key` en évitant une agrégation coûteuse sur le serveur initiateur (ce qui réduit la consommation mémoire de la requête sur ce serveur).

Les types de requêtes suivants sont pris en charge (ainsi que toutes leurs combinaisons) :

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

Les types de requêtes suivants ne sont pas pris en charge (la prise en charge de certains d’entre eux pourra être ajoutée ultérieurement) :

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

Valeurs possibles :

* 0 — Désactivé.
* 1 — Activé.

Voir aussi :

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

<Note>
  À l’heure actuelle, cela nécessite `optimize_skip_unused_shards` (la raison est qu’à terme, ce paramètre pourrait être activé par défaut, et il ne fonctionnera correctement que si les données ont été insérées via une table Distributed, c’est-à-dire si elles sont distribuées selon `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": "Nouveau paramètre"}]}]} />

Lorsqu'il est activé, `OPTIMIZE ... DRY RUN` valide la partie fusionnée obtenue à l'aide de `checkDataPart`. Si cette vérification échoue, une exception est levée.

<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": "Nouveau paramètre."}]}]} />

Convertit des expressions telles que col = '' ou '' = col en empty(col), et col != '' ou '' != col en notEmpty(col),
uniquement lorsque col est de type 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": "Optimise les expressions WHERE, PREWHERE, ON, HAVING et QUALIFY en extrayant les expressions communes de disjonctions de conjonctions."}]}, {"id": "row-2","items": [{"label": "24.12"},{"label": "0"},{"label": "Introduit un paramètre pour optimiser les expressions WHERE, PREWHERE, ON, HAVING et QUALIFY en extrayant les expressions communes de disjonctions de conjonctions."}]}]} />

Permet d'extraire des expressions communes de disjonctions dans les expressions WHERE, PREWHERE, ON, HAVING et QUALIFY. Une expression logique comme `(A AND B) OR (A AND C)` peut être réécrite en `A AND (B OR C)`, ce qui peut aider à utiliser :

* les indices dans des expressions de filtrage simples
* l'optimisation des CROSS JOIN en 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": "Paramètre activé par défaut"}]}]} />

Active ou désactive l’optimisation qui consiste à transformer certaines fonctions en lecture de sous-colonnes. Cela réduit la quantité de données à lire.

Ces fonctions peuvent être transformées :

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

Valeurs possibles :

* 0 — Optimisation désactivée.
* 1 — Optimisation activée.

<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": "Nouveau paramètre"}]}]} />

Évite les recherches inverses répétées dans le dictionnaire en effectuant des recherches plus rapides dans un ensemble précalculé de valeurs possibles pour la clé.

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

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

Remplace « multiIf » comportant une seule condition par « 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": "Réécrit par défaut en count() les fonctions d’agrégation sémantiquement équivalentes à count()"}]}]} />

Réécrit par défaut en count() les fonctions d’agrégation sémantiquement équivalentes à 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": "Active par défaut l’optimisation des données à l’INSERT pour une meilleure expérience utilisateur"}]}]} />

Active ou désactive la transformation des données avant l’insertion, comme si une fusion avait été effectuée sur ce bloc (selon le moteur de table).

Valeurs possibles :

* 0 — Désactivé.
* 1 — Activé.

**Exemple**

Différence entre l’état activé et désactivé :

Requête :

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

Résultat :

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

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

Notez que ce paramètre influence le comportement des [vues matérialisées](/docs/fr/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": "Nouveau paramètre qui active un second passage de promotion de PREWHERE afin de fusionner dans la chaîne PREWHERE existante les filtres ajoutés au-dessus d’une étape de lecture MergeTree par des optimisations ultérieures (pushdown de prédicats à travers JOIN, réécritures de projection)."}]}]} />

Exécute un second passage de promotion de `PREWHERE` après que des optimisations ultérieures du plan de requête ont pu
ajouter des filtres supplémentaires au-dessus d’une étape de lecture `MergeTree` (par ex. pushdown de prédicats via
`JOIN`, réécritures de projection). Lorsqu’un `PREWHERE` existe déjà, le nouveau
filtre y est fusionné avec `AND` au lieu de rester une étape de filtrage distincte.

<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": "Nouveau paramètre"}]}]} />

Remplace les fonctions de distance appliquées au type de données `QBit` par des fonctions équivalentes qui ne lisent dans le stockage que les colonnes nécessaires au calcul.

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

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

Active l’optimisation [ORDER BY](/docs/fr/reference/statements/select/order-by#optimization-of-data-reading) dans les requêtes [SELECT](/docs/fr/reference/statements/select/index) lors de la lecture des données à partir des tables [MergeTree](/docs/fr/reference/engines/table-engines/mergetree-family/mergetree).

Valeurs possibles :

* 0 — l’optimisation `ORDER BY` est désactivée.
* 1 — l’optimisation `ORDER BY` est activée.

**Voir aussi**

* [Clause ORDER BY](/docs/fr/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 ce paramètre est défini sur true, les alias seront pris en compte dans WHERE/GROUP BY/ORDER BY, ce qui facilitera l’élagage des partitions, l’utilisation des index secondaires, ainsi que optimize\_aggregation\_in\_order, optimize\_read\_in\_order et optimize\_trivial\_count

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

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

Optimise le tri à l’aide des propriétés de tri du flux d’entrée

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

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

Utilisez les [contraintes](/docs/fr/reference/statements/create/table#constraints) pour remplacer des colonnes. La valeur par défaut est `false`.

Valeurs possibles :

* 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": "L’optimisation est prête pour la production"}]}]} />

Permet de fusionner des fonctions d’agrégation ayant un argument identique. Réécrit une requête contenant au moins deux fonctions d’agrégation parmi [sum](/docs/fr/reference/functions/aggregate-functions/sum), [count](/docs/fr/reference/functions/aggregate-functions/count) ou [avg](/docs/fr/reference/functions/aggregate-functions/avg), ayant un argument identique, en [sumCount](/docs/fr/reference/functions/aggregate-functions/sumCount).

Valeurs possibles :

* 0 — Les fonctions ayant un argument identique ne sont pas fusionnées.
* 1 — Les fonctions ayant un argument identique sont fusionnées.

**Exemple**

Requête :

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

Résultat :

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

Active ou désactive le déclenchement d'une exception si une requête [OPTIMIZE](/docs/fr/reference/statements/optimize) n'a effectué aucune fusion.

Par défaut, `OPTIMIZE` se termine avec succès même s'il n'a rien fait. Ce paramètre vous permet de distinguer ces situations et d'obtenir la raison dans le message d'exception.

Valeurs possibles :

* 1 — Le déclenchement d'une exception est activé.
* 0 — Le déclenchement d'une exception est désactivé.

<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": "Optimise les prédicats Date et DateTime en transformant les fonctions en comparaisons équivalentes sans conversion (p. ex. toYear(col) = 2023 -> col >= '2023-01-01' AND col <= '2023-12-31')"}]}]} />

Optimise les prédicats Date et DateTime en transformant les fonctions en comparaisons équivalentes sans conversion (p. 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": "Supprime les éléments ORDER BY en fin de clause une fois que toutes les clés GROUP BY sont couvertes par le préfixe ORDER BY."}]}]} />

Supprime les éléments ORDER BY en fin de clause une fois que toutes les clés GROUP BY sont couvertes par le préfixe ORDER BY.

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

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

Réécrit `uniq` et ses variantes (sauf `uniqUpTo`) en `count` si la sous-requête contient `distinct` ou une clause `GROUP BY`.

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

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

Utilisez les [contraintes](/docs/fr/reference/statements/create/table#constraints) pour optimiser les requêtes. La valeur par défaut est `false`.

Valeurs possibles :

* true, false
