> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-detect-table-modification.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# paramètres de session optimize_trivial_*

> Paramètres de session de ClickHouse du groupe généré optimize_trivial_*.

export const BetaBadge = ({link, galaxyTrack, galaxyEvent}) => {
  if (link) {
    return <a href={link} target="_blank" rel="noopener noreferrer" className="betaBadge" onClick={galaxyTrack && galaxyEvent ? galaxyOnClick(galaxyEvent) : undefined}>
                <span>Beta</span>
            </a>;
  }
  return <a href="https://clickhouse.com/docs/reference/settings/beta-and-experimental-features#beta-features" className="betaBadge">
            <span>Fonctionnalité en bêta</span>
        </a>;
};

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_trivial_approximate_count_query">
  ## optimize\_trivial\_approximate\_count\_query
</div>

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

Utilise une valeur approximative pour optimiser les requêtes de comptage triviales sur les stockages qui prennent en charge ce type d’estimation, par exemple EmbeddedRocksDB.

Valeurs possibles :

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

<div id="optimize_trivial_count_query">
  ## optimize\_trivial\_count\_query
</div>

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

Active ou désactive l’optimisation de la requête triviale `SELECT count() FROM table` à l’aide des métadonnées de MergeTree. Si vous devez utiliser la sécurité au niveau des lignes, désactivez ce paramètre.

Valeurs possibles :

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

Voir aussi :

* [optimize\_functions\_to\_subcolumns](/fr/reference/settings/session-settings/optimize#optimize_functions_to_subcolumns)

<div id="optimize_trivial_count_with_sparsity_filter">
  ## optimize\_trivial\_count\_with\_sparsity\_filter
</div>

<BetaBadge />

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

<VersionHistory rows={[{"id": "row-1","items": [{"label": "26.8"},{"label": "1"},{"label": "Passage en BÊTA et activation par défaut : traiter `SELECT count() FROM t WHERE <pred>` à partir des compteurs persistants `num_defaults` \/ `num_rows` par colonne lorsque `<pred>` répartit les lignes entre valeurs par défaut et valeurs non par défaut. Nécessite le paramètre MergeTree `compute_exact_num_defaults_for_sparse_columns` (désormais également activé par défaut)."}]}, {"id": "row-2","items": [{"label": "26.7"},{"label": "0"},{"label": "Nouveau paramètre (expérimental) permettant de traiter `SELECT count() FROM t WHERE <pred>` à partir des compteurs `num_defaults` \/ `num_rows` par colonne enregistrés dans `serialization.json` lorsque `<pred>` répartit les lignes entre valeurs par défaut et valeurs non par défaut."}]}]} />

Étend l’optimisation [optimize\_trivial\_count\_query](/fr/reference/settings/session-settings/optimize-trivial#optimize_trivial_count_query) aux
requêtes de la forme `SELECT count() FROM t WHERE col <op> const`, où `<op> const`
répartit exactement les lignes entre les valeurs par défaut et les valeurs non par défaut de `col`. Le décompte est alors
obtenu à partir des compteurs `num_defaults` / `num_rows` par colonne que MergeTree
conserve déjà dans `serialization.json`, sans parcours des données.

Motifs reconnus :

* `col = default(col)` / `col != default(col)` pour `Int*` / `UInt*`, `String` /
  `FixedString`, `Date` / `DateTime` / `DateTime64`, `Decimal*`, `UUID`, `IPv4` / `IPv6`.
* `IS NULL` / `IS NOT NULL` sur les colonnes `Nullable`.
* `empty(col)` / `notEmpty(col)` sur les colonnes `String`.
* `col = true` / `col != true` sur les colonnes `Bool`.
* `col > 0`, `col >= 1`, `col < 1`, `col <= 0` sur les colonnes d’entiers non signés.
* `col` / `NOT col` seuls sur les colonnes `Int*`, `UInt*`, `Bool` (test de vérité).

Les motifs d’égalité ne s’appliquent pas à `Float*`, `Enum*`, `Nullable`, `LowCardinality`,
ni aux types composés (`Tuple`, `Array`, `Map`, ...) — pour ceux-ci, le décompte suit le
chemin de parcours normal.

Pour prendre effet, le compteur `num_defaults` par part doit être exact. Activez le
paramètre de table MergeTree `compute_exact_num_defaults_for_sparse_columns` sur la table cible avant
les insertions et les fusions. Les parts écrites sans ce paramètre sont silencieusement exclues de la réécriture, donc
activer uniquement `optimize_trivial_count_with_sparsity_filter` ne suffit pas.

Pour les motifs `IS NULL` / `IS NOT NULL` sur les colonnes `Nullable`, la colonne doit aussi
avoir une entrée `num_defaults` dans `serialization.json`, ce qui n’arrive que lorsque le paramètre de table MergeTree
`nullable_serialization_version` est défini sur `allow_sparse` au moment de l’insert /
merge. Avec la valeur par défaut `basic`, les colonnes `Nullable` n’obtiennent aucune entrée par colonne, donc
l’optimisation ne s’applique tout simplement pas.

Valeurs possibles :

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

Voir aussi :

* [optimize\_trivial\_count\_query](/fr/reference/settings/session-settings/optimize-trivial#optimize_trivial_count_query)

<div id="optimize_trivial_group_by_limit_query">
  ## optimize\_trivial\_group\_by\_limit\_query
</div>

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

<VersionHistory rows={[{"id": "row-1","items": [{"label": "26.5"},{"label": "1"},{"label": "Nouveau paramètre qui limite l’agrégation à au plus LIMIT clés distinctes pour les requêtes `SELECT key_expr FROM t GROUP BY key_expr LIMIT n`."}]}]} />

Active ou désactive l’optimisation de la requête triviale `SELECT key_expr FROM table GROUP BY key_expr LIMIT n` (sans fonctions d’agrégation, fonctions de fenêtre ni `arrayJoin` dans la projection, sans clauses `HAVING`/`ORDER BY`/`QUALIFY`/`LIMIT BY`/`DISTINCT`/de fenêtre, et sans modificateurs `GROUP BY`) en définissant `max_rows_to_group_by = n + offset` avec `group_by_overflow_mode = 'any'`. L’agrégation s’arrête dès que `n + offset` clés distinctes ont été produites.

L’optimisation est désactivée lorsque l’utilisateur a explicitement défini `group_by_overflow_mode` sur une valeur autre que `any` (afin de préserver son comportement explicite `throw`/`break`), ainsi que lorsque l’utilisateur a déjà défini une valeur `max_rows_to_group_by` plus restrictive (l’optimisation serait alors sans effet).

Valeurs possibles :

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

<div id="optimize_trivial_insert_select">
  ## optimize\_trivial\_insert\_select
</div>

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

<VersionHistory rows={[{"id": "row-1","items": [{"label": "24.7"},{"label": "0"},{"label": "L’optimisation n’a pas de sens dans bien des cas."}]}]} />

Optimiser la requête triviale 'INSERT INTO table SELECT ... FROM TABLES'

<div id="optimize_trivial_view_pushdown_to_distributed">
  ## optimize\_trivial\_view\_pushdown\_to\_distributed
</div>

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

<VersionHistory rows={[{"id": "row-1","items": [{"label": "26.8"},{"label": "1"},{"label": "Nouveau paramètre permettant de transmettre l’intégralité de la requête externe aux segments pour les vues triviales sur des tables Distributed."}]}]} />

Lorsqu’elle est activée, pour les vues sur des tables [Distributed](/fr/reference/engines/table-engines/special/distributed) dont la liste `SELECT` ne contient que des références à des colonnes, `*`,
ou des expressions (mais aucune fonction fenêtre ni sous-requête scalaire), et qui ne comportent ni agrégation, ni regroupement, ni tri, ni jointure, l’intégralité de la requête externe est transmise à
chaque segment. Cela permet à chaque segment d’appliquer localement les filtres et les expressions de la vue, réduisant ainsi la quantité de données transférées sur le réseau.

Valeurs possibles :

* 0 — L’optimisation est désactivée ; les vues sur des tables `Distributed` sont toujours exécutées sur le coordinateur.
* 1 — L’optimisation est activée.
