Pular para o conteúdo principal
Este motor permite integrar o ClickHouse ao RocksDB.

Criando uma tabela

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 do motor:
  • ttl - tempo de vida dos valores. O TTL é aceito em segundos. Se o TTL for 0, uma instância regular do RocksDB será usada (sem TTL).
  • rocksdb_dir - caminho para o diretório de um RocksDB existente ou caminho de destino do RocksDB criado. Abre a tabela com o rocksdb_dir especificado.
  • read_only - quando read_only é definido como true, o modo somente leitura é usado. Para armazenamento com TTL, a compactação não será acionada (nem manual nem automaticamente), portanto nenhuma entrada expirada será removida.
  • primary_key_name – qualquer nome de coluna na lista de colunas.
  • a primary key deve ser especificada; ela oferece suporte a apenas uma coluna na chave primária. A chave primária será serializada em formato binário como uma rocksdb key.
  • colunas diferentes da chave primária serão serializadas em formato binário como valor rocksdb, na ordem correspondente.
  • consultas com filtragem por chave equals ou in serão otimizadas para busca de várias chaves no rocksdb.
Configurações do motor:
  • optimize_for_bulk_insert – A tabela é otimizada para inserções em massa (o pipeline de insert criará arquivos SST e os importará para o banco de dados rocksdb, em vez de gravar em memtables); valor padrão: 1.
  • bulk_insert_block_size - Tamanho mínimo dos arquivos SST (em número de linhas) criados por inserção em massa; valor padrão: 1048449.
Exemplo:
CREATE TABLE test
(
    `key` String,
    `v1` UInt32,
    `v2` String,
    `v3` Float32
)
ENGINE = EmbeddedRocksDB
PRIMARY KEY key

Métricas

Há também a tabela system.rocksdb, que expõe estatísticas do RocksDB:
SELECT
    name,
    value
FROM system.rocksdb

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

Configuração

Você também pode alterar qualquer uma das opções do RocksDB usando 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>
Por padrão, a otimização trivial de contagem aproximada vem desativada, o que pode afetar o desempenho das consultas count(). Para ativar essa otimização, defina optimize_trivial_approximate_count_query = 1. Além disso, essa configuração afeta system.tables para o motor EmbeddedRocksDB; ative essa configuração para ver valores aproximados de total_rows e total_bytes.

Operações suportadas

Inserções

Quando novas linhas forem inseridas em EmbeddedRocksDB, se a chave já existir, o valor será atualizado; caso contrário, uma nova chave será criada. Exemplo:
INSERT INTO test VALUES ('some key', 1, 'value', 3.2);

Exclusões

As linhas podem ser excluídas com a consulta DELETE ou com 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;

Atualizações

Os valores podem ser atualizados por meio da consulta ALTER TABLE. A chave primária não pode ser atualizada.
ALTER TABLE test UPDATE v1 = v1 * 10 + 2 WHERE key LIKE 'some%' AND v3 > 3.1;

Junções

Há suporte a uma direct join especial com tabelas EmbeddedRocksDB. Essa junção direta evita a criação de uma tabela hash na memória e acessa os dados diretamente do EmbeddedRocksDB. Em junções grandes, você pode observar um uso de memória muito menor com junções diretas, porque a tabela hash não é criada. Para habilitar junções diretas:
SET join_algorithm = 'direct, hash'
Quando join_algorithm estiver definido como direct, hash, as junções diretas serão usadas sempre que possível; caso contrário, será usado hash.

Exemplo

Criar e popular uma tabela 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);
Crie e popule uma tabela para fazer junção com a tabela rdb
CREATE TABLE t2
(
    `k` UInt16
)
ENGINE = TinyLog
INSERT INTO t2 SELECT number AS k
FROM numbers_mt(10)
Defina o algoritmo de junção como direct
SET join_algorithm = 'direct'
Um 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  │
└─────┴─────────┴────────┴────────┘

Mais informações sobre junções

Última modificação em 10 de junho de 2026