> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-postgresql-tls-support.mintlify.site/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 VersionHistory = ({rows = []}) => {
  if (rows.length === 0) {
    return null;
  }
  const headers = ["Version", "Valeur par défaut", "Commentaire"];
  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
  }}>
        Historique des versions
      </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
  }}>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](/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](/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" />

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

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

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

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

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

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

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

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

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

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

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

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

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](/fr/reference/statements/select/order-by#optimization-of-data-reading) dans les requêtes [SELECT](/fr/reference/statements/select/index) lors de la lecture des données à partir des tables [MergeTree](/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](/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](/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" />

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](/fr/reference/functions/aggregate-functions/sum), [count](/fr/reference/functions/aggregate-functions/count) ou [avg](/fr/reference/functions/aggregate-functions/avg), ayant un argument identique, en [sumCount](/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](/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" />

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

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](/fr/reference/statements/create/table#constraints) pour optimiser les requêtes. La valeur par défaut est `false`.

Valeurs possibles :

* true, false
