Passer au contenu principal
Ce moteur permet d’intégrer ClickHouse à RocksDB.

Créer une table

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 :
CREATE TABLE test
(
    `key` String,
    `v1` UInt32,
    `v2` String,
    `v3` Float32
)
ENGINE = EmbeddedRocksDB
PRIMARY KEY key

Métriques

Il existe également la table system.rocksdb, qui fournit des statistiques sur rocksdb :
SELECT
    name,
    value
FROM system.rocksdb

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

Configuration

Vous pouvez également modifier n’importe quelle option de RocksDB via la config :
<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.

Opérations prises en charge

Insertions

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 :
INSERT INTO test VALUES ('some key', 1, 'value', 3.2);

Suppressions

Les lignes peuvent être supprimées à l’aide d’une requête DELETE ou de TRUNCATE.
DELETE FROM test WHERE key LIKE 'some%' AND v1 > 1;
ALTER TABLE test DELETE WHERE key LIKE 'some%' AND v1 > 1;
TRUNCATE TABLE test;

Mises à jour

Les valeurs peuvent être mises à jour à l’aide de la requête ALTER TABLE. La clé primaire ne peut pas être modifiée.
ALTER TABLE test UPDATE v1 = v1 * 10 + 2 WHERE key LIKE 'some%' AND v3 > 3.1;

Jointures

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 :
SET join_algorithm = 'direct, hash'
Lorsque join_algorithm est défini sur direct, hash, les jointures directes seront utilisées lorsque c’est possible, et hash sinon.

Exemple

Créer et peupler une table EmbeddedRocksDB
CREATE TABLE rdb
(
    `key` UInt32,
    `value` Array(UInt32),
    `value2` String
)
ENGINE = EmbeddedRocksDB
PRIMARY KEY key
INSERT INTO rdb
    SELECT
        toUInt32(sipHash64(number) % 10) AS key,
        [key, key+1] AS value,
        ('val2' || toString(key)) AS value2
    FROM numbers_mt(10);
Créer et peupler une table pour effectuer une jointure avec la table rdb
CREATE TABLE t2
(
    `k` UInt16
)
ENGINE = TinyLog
INSERT INTO t2 SELECT number AS k
FROM numbers_mt(10)
Définissez l’algorithme de jointure à direct
SET join_algorithm = 'direct'
Un INNER JOIN
SELECT *
FROM
(
    SELECT k AS key
    FROM t2
) AS t2
INNER JOIN rdb ON rdb.key = t2.key
ORDER BY key ASC
┌─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  │
└─────┴─────────┴────────┴────────┘

Informations complémentaires sur les jointures

Dernière modification le 25 juin 2026