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

> Ce moteur permet d'intégrer ClickHouse à RocksDB

# Moteur de table EmbeddedRocksDB

export const CloudNotSupportedBadge = () => {
  return <div className="cloudNotSupportedBadge">
            <div className="cloudNotSupportedIcon">
            <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
                <path strokeWidth="1.5" d="M6.33366 12.6666L12.3739 12.6667C13.6593 12.6667 14.7073 11.6187 14.7073 10.3334C14.7073 9.04804 13.6593 8.00003 12.3739 8.00003C12.3739 8.00003 12.3337 7.66659 12.0003 7.33325M10.667 5.33322C8.00033 2.33325 4.45395 4.78537 4.14195 6.68203C2.55728 6.7627 1.29395 8.06203 1.29395 9.6667C1.29395 11.3234 2.66699 12.6666 4.00033 12.6666" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
                <path strokeWidth="1.5" d="M2.66699 14L12.0003 4.66663" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
            </svg>

        </div>
            Non pris en charge par ClickHouse Cloud
        </div>;
};

Ce moteur permet d’intégrer ClickHouse à [RocksDB](http://rocksdb.org/).

<div id="creating-a-table">
  ## Créer une table
</div>

```sql theme={null}
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
    name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
    name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
    ...
) ENGINE = EmbeddedRocksDB([ttl, rocksdb_dir, read_only]) PRIMARY KEY(primary_key_name)
[ SETTINGS name=value, ... ]
```

Paramètres du moteur :

* `ttl` - durée de vie des valeurs. Le TTL est exprimé en secondes. Si le TTL vaut 0, une instance RocksDB standard est utilisée (sans TTL).
* `rocksdb_dir` - chemin vers le répertoire d'une instance RocksDB existante ou chemin de destination de l'instance RocksDB créée. Ouvre la table avec le `rocksdb_dir` spécifié.
* `read_only` - lorsque `read_only` est défini sur true, le mode lecture seule est utilisé. Pour un stockage avec TTL, la compaction ne sera pas déclenchée (ni manuellement ni automatiquement), donc aucune entrée expirée ne sera supprimée.
* `primary_key_name` – n'importe quel nom de colonne dans la liste des colonnes.
* `primary key` doit être spécifiée ; elle ne prend en charge qu'une seule colonne. La clé primaire sera sérialisée au format binaire comme `rocksdb key`.
* les colonnes autres que la clé primaire seront sérialisées au format binaire comme valeur `rocksdb`, dans l'ordre correspondant.
* les requêtes avec filtrage sur la clé via `equals` ou `in` seront optimisées en recherche de plusieurs clés dans `rocksdb`.

Réglages du moteur :

* `optimize_for_bulk_insert` – la table est optimisée pour les insertions en masse (le pipeline d'insertion créera des fichiers SST et les importera dans la base de données rocksdb au lieu d'écrire dans les memtables) ; valeur par défaut : `1`.
* `bulk_insert_block_size` - taille minimale des fichiers SST (en nombre de lignes) créés par insertion en masse ; valeur par défaut : `1048449`.

Exemple :

```sql theme={null}
CREATE TABLE test
(
    `key` String,
    `v1` UInt32,
    `v2` String,
    `v3` Float32
)
ENGINE = EmbeddedRocksDB
PRIMARY KEY key
```

<div id="metrics">
  ## Métriques
</div>

Il existe également la table `system.rocksdb`, qui fournit des statistiques sur rocksdb :

```sql theme={null}
SELECT
    name,
    value
FROM system.rocksdb

┌─name──────────────────────┬─value─┐
│ no.file.opens             │     1 │
│ number.block.decompressed │     1 │
└───────────────────────────┴───────┘
```

<div id="configuration">
  ## Configuration
</div>

Vous pouvez également modifier n’importe quelle [option de RocksDB](https://github.com/facebook/rocksdb/wiki/Option-String-and-Option-Map) via la config :

```xml theme={null}
<rocksdb>
    <options>
        <max_background_jobs>8</max_background_jobs>
    </options>
    <column_family_options>
        <num_levels>2</num_levels>
    </column_family_options>
    <tables>
        <table>
            <name>TABLE</name>
            <options>
                <max_background_jobs>8</max_background_jobs>
            </options>
            <column_family_options>
                <num_levels>2</num_levels>
            </column_family_options>
        </table>
    </tables>
</rocksdb>
```

Par défaut, l’optimisation de comptage approximatif trivial est désactivée, ce qui peut affecter les performances des requêtes `count()`. Pour activer cette
optimisation, définissez `optimize_trivial_approximate_count_query = 1`. Ce paramètre affecte également `system.tables` pour le moteur EmbeddedRocksDB ;
activez-le pour voir des valeurs approximatives de `total_rows` et `total_bytes`.

<div id="supported-operations">
  ## Opérations prises en charge
</div>

<div id="inserts">
  ### Insertions
</div>

Lorsque de nouvelles lignes sont insérées dans `EmbeddedRocksDB`, si la clé existe déjà, la valeur est mise à jour ; sinon, une nouvelle clé est créée.

Exemple :

```sql theme={null}
INSERT INTO test VALUES ('some key', 1, 'value', 3.2);
```

<div id="deletes">
  ### Suppressions
</div>

Les lignes peuvent être supprimées à l’aide d’une requête `DELETE` ou de `TRUNCATE`.

```sql theme={null}
DELETE FROM test WHERE key LIKE 'some%' AND v1 > 1;
```

```sql theme={null}
ALTER TABLE test DELETE WHERE key LIKE 'some%' AND v1 > 1;
```

```sql theme={null}
TRUNCATE TABLE test;
```

<div id="updates">
  ### Mises à jour
</div>

Les valeurs peuvent être mises à jour à l’aide de la requête `ALTER TABLE`. La clé primaire ne peut pas être modifiée.

```sql theme={null}
ALTER TABLE test UPDATE v1 = v1 * 10 + 2 WHERE key LIKE 'some%' AND v3 > 3.1;
```

<div id="joins">
  ### Jointures
</div>

Une jointure `direct` spéciale avec des tables EmbeddedRocksDB est prise en charge.
Cette jointure directe évite de construire une table de hachage en mémoire et accède
directement aux données dans EmbeddedRocksDB.

Avec de grosses jointures, l'utilisation de la mémoire peut être nettement plus faible avec les jointures directes,
car la table de hachage n'est pas créée.

Pour activer les jointures directes :

```sql theme={null}
SET join_algorithm = 'direct, hash'
```

<Tip>
  Lorsque `join_algorithm` est défini sur `direct, hash`, les jointures directes seront utilisées
  lorsque c'est possible, et `hash` sinon.
</Tip>

<div id="example">
  #### Exemple
</div>

<div id="create-and-populate-an-embeddedrocksdb-table">
  ##### Créer et peupler une table EmbeddedRocksDB
</div>

```sql theme={null}
CREATE TABLE rdb
(
    `key` UInt32,
    `value` Array(UInt32),
    `value2` String
)
ENGINE = EmbeddedRocksDB
PRIMARY KEY key
```

```sql theme={null}
INSERT INTO rdb
    SELECT
        toUInt32(sipHash64(number) % 10) AS key,
        [key, key+1] AS value,
        ('val2' || toString(key)) AS value2
    FROM numbers_mt(10);
```

<div id="create-and-populate-a-table-to-join-with-table-rdb">
  ##### Créer et peupler une table pour effectuer une jointure avec la table `rdb`
</div>

```sql theme={null}
CREATE TABLE t2
(
    `k` UInt16
)
ENGINE = TinyLog
```

```sql theme={null}
INSERT INTO t2 SELECT number AS k
FROM numbers_mt(10)
```

<div id="set-the-join-algorithm-to-direct">
  ##### Définissez l’algorithme de jointure à `direct`
</div>

```sql theme={null}
SET join_algorithm = 'direct'
```

<div id="an-inner-join">
  ##### Un INNER JOIN
</div>

```sql theme={null}
SELECT *
FROM
(
    SELECT k AS key
    FROM t2
) AS t2
INNER JOIN rdb ON rdb.key = t2.key
ORDER BY key ASC
```

```response theme={null}
┌─key─┬─rdb.key─┬─value──┬─value2─┐
│   0 │       0 │ [0,1]  │ val20  │
│   2 │       2 │ [2,3]  │ val22  │
│   3 │       3 │ [3,4]  │ val23  │
│   6 │       6 │ [6,7]  │ val26  │
│   7 │       7 │ [7,8]  │ val27  │
│   8 │       8 │ [8,9]  │ val28  │
│   9 │       9 │ [9,10] │ val29  │
└─────┴─────────┴────────┴────────┘
```

<div id="more-information-on-joins">
  ### Informations complémentaires sur les jointures
</div>

* [paramètre `join_algorithm`](/fr/reference/settings/session-settings#join_algorithm)
* [clause JOIN](/fr/reference/statements/select/join)
