Saltar al contenido principal
Este motor permite la integración de ClickHouse con RocksDB.

Crear una tabla

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, ... ]
Parámetros del motor:
  • ttl - tiempo de vida de los valores. TTL se acepta en segundos. Si TTL es 0, se usa una instancia normal de RocksDB (sin TTL).
  • rocksdb_dir - ruta al directorio de una instancia de RocksDB existente o ruta de destino de la instancia de RocksDB creada. Abre la tabla con el rocksdb_dir especificado.
  • read_only - cuando read_only se establece en true, se usa el modo de solo lectura. Para el almacenamiento con TTL, no se activará la compactación (ni manual ni automática), por lo que no se eliminarán las entradas caducadas.
  • primary_key_name – cualquier nombre de columna de la lista de columnas.
  • primary key debe especificarse; solo admite una columna en la clave primaria. La clave primaria se serializará en binario como una rocksdb key.
  • las columnas distintas de la clave primaria se serializarán en binario como valor rocksdb en el orden correspondiente.
  • las consultas con filtrado de clave equals o in se optimizarán para la búsqueda de múltiples claves en rocksdb.
Configuración del motor:
  • optimize_for_bulk_insert – La tabla está optimizada para inserciones masivas (el pipeline de inserción creará archivos SST y los importará a la base de datos de rocksdb en lugar de escribir en memtables); valor predeterminado: 1.
  • bulk_insert_block_size - Tamaño mínimo de los archivos SST (en número de filas) creados por la inserción masiva; valor predeterminado: 1048449.
Ejemplo:
CREATE TABLE test
(
    `key` String,
    `v1` UInt32,
    `v2` String,
    `v3` Float32
)
ENGINE = EmbeddedRocksDB
PRIMARY KEY key

Métricas

También está la tabla system.rocksdb, que expone estadísticas de RocksDB:
SELECT
    name,
    value
FROM system.rocksdb

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

Configuración

También puedes cambiar cualquier opción de RocksDB mediante la configuración:
<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>
De forma predeterminada, la optimización trivial de conteo aproximado está desactivada, lo que podría afectar al rendimiento de las consultas count(). Para habilitar esta optimización, configure optimize_trivial_approximate_count_query = 1. Además, esta configuración afecta a system.tables para el motor EmbeddedRocksDB; active esta opción para ver valores aproximados de total_rows y total_bytes.

Operaciones admitidas

Inserciones

Cuando se insertan nuevas filas en EmbeddedRocksDB, si la clave ya existe, se actualizará el valor; de lo contrario, se creará una nueva clave. Ejemplo:
INSERT INTO test VALUES ('some key', 1, 'value', 3.2);

Borrados

Las filas se pueden eliminar con la consulta DELETE o con 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;

Actualizaciones

Los valores se pueden actualizar mediante la consulta ALTER TABLE. La clave primaria no se puede actualizar.
ALTER TABLE test UPDATE v1 = v1 * 10 + 2 WHERE key LIKE 'some%' AND v3 > 3.1;

Joins

Se admite un JOIN direct especial con tablas EmbeddedRocksDB. Este JOIN directo evita crear una tabla hash en memoria y accede a los datos directamente desde EmbeddedRocksDB. Con joins grandes, es posible que el uso de memoria sea mucho menor con joins directos, ya que no se crea la tabla hash. Para habilitar los joins directos:
SET join_algorithm = 'direct, hash'
Cuando join_algorithm está configurado como direct, hash, se usarán JOIN directos siempre que sea posible, y hash en caso contrario.

Ejemplo

Crear y poblar una tabla 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);
Crear y poblar una tabla para hacer JOIN con la tabla rdb
CREATE TABLE t2
(
    `k` UInt16
)
ENGINE = TinyLog
INSERT INTO t2 SELECT number AS k
FROM numbers_mt(10)
Establecer el algoritmo de join en 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  │
└─────┴─────────┴────────┴────────┘

Más información sobre los JOIN

Última modificación el 10 de junio de 2026