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 elrocksdb_direspecificado.read_only- cuandoread_onlyse 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 keydebe especificarse; solo admite una columna en la clave primaria. La clave primaria se serializará en binario como unarocksdb key.- las columnas distintas de la clave primaria se serializarán en binario como valor
rocksdben el orden correspondiente. - las consultas con filtrado de clave
equalsoinse optimizarán para la búsqueda de múltiples claves enrocksdb.
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 keyMétricas
También está la tabla system.rocksdb, que expone estadísticas de RocksDB:
SELECT
name,
value
FROM system.rocksdb
┌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'Ejemplo
Crear y poblar una tabla EmbeddedRocksDB
CREATE TABLE rdb
(
`key` UInt32,
`value` Array(UInt32),
`value2` String
)
ENGINE = EmbeddedRocksDB
PRIMARY KEY keyINSERT 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 = TinyLogINSERT 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 │
└─────┴─────────┴────────┴────────┘