> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-parallel-read-in-order-multi-part.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).

## optimize\_aggregators\_of\_group\_by\_keys

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

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

## optimize\_append\_index

<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

## optimize\_arithmetic\_operations\_in\_aggregate\_functions

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

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

## optimize\_const\_name\_size

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

## optimize\_count\_from\_files

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

## optimize\_dictget\_tuple\_element

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

## optimize\_distinct\_in\_order

<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

## optimize\_distributed\_group\_by\_sharding\_key

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

## optimize\_dry\_run\_check\_part

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

## optimize\_empty\_string\_comparisons

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

## optimize\_extract\_common\_expressions

<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

## optimize\_functions\_to\_subcolumns

<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](/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).
* [has](/fr/reference/functions/regular-functions/array-functions#has) et [notHas](/fr/reference/functions/regular-functions/array-functions#notHas) pour `Map` afin de lire la sous-colonne [keys](/fr/reference/data-types/map#reading-subcolumns-of-map).
* [mapContainsKeyLike](/fr/reference/functions/regular-functions/tuple-map-functions#mapContainsKeyLike) pour lire la sous-colonne [keys](/fr/reference/data-types/map#reading-subcolumns-of-map).
* [mapContainsValueLike](/fr/reference/functions/regular-functions/tuple-map-functions#mapContainsValueLike) 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.

## optimize\_inverse\_dictionary\_lookup

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

## optimize\_multiif\_to\_if

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

Remplace « multiIf » comportant une seule condition par « if ».

## optimize\_mutations\_with\_partition\_pruning

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

<VersionHistory rows={[{"id": "row-1","items": [{"label": "26.9"},{"label": "1"},{"label": "Nouveau paramètre permettant d'élaguer automatiquement les partitions pour les mutations en fonction de la clause WHERE"}]}]} />

Lorsque ce paramètre est activé, ClickHouse détecte automatiquement les conditions portant sur la clé de partitionnement dans la clause WHERE des mutations `ALTER TABLE UPDATE`/`DELETE` et des instructions lightweight `UPDATE`/`DELETE` sur les tables de la famille `ReplicatedMergeTree`, et ne traite que les partitions concernées au lieu de toutes les partitions.

Cet élagage automatique ne s'applique actuellement qu'aux tables répliquées. Sur les tables `MergeTree` non répliquées, utilisez une clause `IN PARTITION` explicite pour limiter une mutation à des partitions précises.

Valeurs possibles :

* 0 — Désactivé. Les mutations et les lightweight updates traitent toutes les partitions.
* 1 — Activé. Les mutations et les lightweight updates ne traitent que les partitions correspondant à la condition WHERE.

## optimize\_normalize\_count\_variants

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

## optimize\_on\_insert

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

## optimize\_prewhere\_after\_pushdown

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

## optimize\_qbit\_distance\_function\_reads

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

## optimize\_read\_in\_order

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

## optimize\_read\_in\_reverse\_order\_final

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

<VersionHistory rows={[{"id": "row-1","items": [{"label": "26.9"},{"label": "1"},{"label": "Nouveau paramètre permettant d'activer l'optimisation de la lecture dans l'ordre lors d'une lecture dans l'ordre inverse de la clé de tri avec le modificateur `FINAL` à partir de tables `ReplacingMergeTree`."}]}]} />

Active la lecture des données dans l'ordre inverse de la clé de tri dans les requêtes `SELECT` avec le modificateur `FINAL` à partir de tables [ReplacingMergeTree](/fr/reference/engines/table-engines/mergetree-family/replacingmergetree). Ne prend effet que si [optimize\_read\_in\_order](/fr/reference/settings/session-settings/optimize#optimize_read_in_order) est également activé.

Valeurs possibles :

* 0 — La lecture dans l'ordre inverse avec `FINAL` est désactivée.
* 1 — La lecture dans l'ordre inverse avec `FINAL` est activée.

## optimize\_respect\_aliases

<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

## optimize\_sorting\_by\_input\_stream\_properties

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

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

## optimize\_substitute\_columns

<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

## optimize\_syntax\_fuse\_functions

<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](/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 TSVRaw;
```

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

## optimize\_throw\_if\_noop

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

## optimize\_time\_filter\_with\_preimage

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

## optimize\_truncate\_order\_by\_after\_group\_by\_keys

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

## optimize\_uniq\_to\_count

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

## optimize\_using\_constraints

<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
