Este motor permite integrar o ClickHouse ao RocksDB.
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
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.decompressed │ 1 │
└───────────────────────────┴───────┘
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.
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);
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;
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;
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.
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 │
└─────┴─────────┴────────┴────────┘