跳至主要内容

嵌入式 RocksDB 引擎

此引擎允许将 ClickHouse 与 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, ... ]

引擎参数

  • ttl - 值的生存时间。TTL 以秒为单位。如果 TTL 为 0,则使用常规 RocksDB 实例(没有 TTL)。
  • rocksdb_dir - 现有 RocksDB 目录的路径或创建的 RocksDB 的目标路径。使用指定的 rocksdb_dir 打开表。
  • read_only - 当 read_only 设置为 true 时,使用只读模式。对于具有 TTL 的存储,不会触发压缩(无论是手动还是自动),因此不会删除过期的条目。
  • primary_key_name - 列列表中的任何列名。
  • 必须指定 主键,它只支持主键中的一个列。主键将被序列化为二进制形式作为 rocksdb 键。
  • 除主键以外的列将被序列化为二进制形式作为 rocksdb 值,并按相应顺序排列。
  • 使用键 等于 过滤的查询将被优化为从 rocksdb 进行多键查找。

引擎设置

  • optimize_for_bulk_insert - 表针对批量插入进行了优化(插入管道将创建 SST 文件并将导入到 rocksdb 数据库,而不是写入内存表);默认值:1
  • bulk_insert_block_size - 批量插入创建的 SST 文件的最小大小(以行数计);默认值:1048449

示例

CREATE TABLE test
(
`key` String,
`v1` UInt32,
`v2` String,
`v3` Float32
)
ENGINE = EmbeddedRocksDB
PRIMARY KEY key

指标

还有一个 system.rocksdb 表,它公开 rocksdb 统计信息

SELECT
name,
value
FROM system.rocksdb

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

配置

您还可以使用配置更改任何 rocksdb 选项

<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>

默认情况下,微不足道的近似计数优化被关闭,这可能会影响 count() 查询的性能。要启用此优化,请设置 optimize_trivial_approximate_count_query = 1。此外,此设置会影响 system.tables(对于嵌入式 RocksDB 引擎),启用该设置以查看 total_rowstotal_bytes 的近似值。

支持的操作

插入

当新的行插入到 EmbeddedRocksDB 中时,如果键已经存在,则会更新值,否则会创建一个新的键。

示例

INSERT INTO test VALUES ('some key', 1, 'value', 3.2);

删除

可以使用 DELETE 查询或 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;

更新

可以使用 ALTER TABLE 查询更新值。无法更新主键。

ALTER TABLE test UPDATE v1 = v1 * 10 + 2 WHERE key LIKE 'some%' AND v3 > 3.1;

联接

支持与嵌入式 RocksDB 表的特殊 直接 联接。这种直接联接避免在内存中形成哈希表,并直接从嵌入式 RocksDB 访问数据。

对于大型联接,由于没有创建哈希表,您可能会看到更低的内存使用量。

要启用直接联接

SET join_algorithm = 'direct, hash'
提示

join_algorithm 设置为 direct, hash 时,如果可能,将使用直接联接,否则使用哈希联接。

示例

创建并填充一个嵌入式 RocksDB 表:
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);
创建并填充一个表以与表 rdb 联接:
CREATE TABLE t2
(
`k` UInt16
)
ENGINE = TinyLog
INSERT INTO t2 SELECT number AS k
FROM numbers_mt(10)
将联接算法设置为 direct:
SET join_algorithm = 'direct'
内部联接:
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 │
└─────┴─────────┴────────┴────────┘

有关联接的更多信息