简介
ALTER 语法更新异步,性能等问题导致clickhouse 不适合做频繁的更新,可以使用 replaceMergeTree代替。
该引擎和MergeTree的不同之处在于它会删除具有相同主键的重复项。
在数据合并的时候会对主键进行去重,合并会在后台执行,执行时间未知,因此你无法预先做出计划,当然你也可以调用OPTIMIZE语句来发起合并计划,但是这种方式是不推荐的,因为OPTIMIZE语句会引发大量的读写请求。
建表语句
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
...
) ENGINE = ReplacingMergeTree([ver])
[PARTITION BY expr]
[ORDER BY expr]
[SAMPLE BY expr]
[SETTINGS name=value, ...]
- ENGINE:引擎名和参数。
- ver:版本列,类型可以是UInt*,Date,或者DateTime,可选择的参数。 合并的时候ReplacingMergeTree从相同的主键中选择一行保留,如果ver列未指定,则选择最后一条,如果ver列已指定,则选择ver值最大的版本。
- PARTITION BY:分区键。要按月分区,可以使用表达式 toYYYYMM(date_column) ,这里的 date_column 是一个 Date 类型的列。这里该分区名格式会是 "YYYYMM" 这样。
- ORDER BY: 表的排序键。可以是一组列或任意的表达式。 例如: ORDER BY (CounterID, EventDate) 。
- SAMPLE BY : 抽样的表达式。如果要用抽样表达式,主键中必须包含这个表达式。例如: SAMPLE BY intHash32(UserID) ORDER BY (CounterID, EventDate, intHash32(UserID)) 。
- SETTINGS : 影响 MergeTree 性能的额外参数:
- index_granularity 索引粒度。即索引中相邻『标记』间的数据行数。默认值,8192 。该列表中所有可用的参数可以从这里查看 MergeTreeSettings.h 。
- use_minimalistic_part_header_in_zookeeper — 数据片段头在 ZooKeeper 中的存储方式。如果设置了 use_minimalistic_part_header_in_zookeeper=1,ZooKeeper 会存储更少的数据。
- min_merge_bytes_to_use_direct_io 使用直接 I/O 来操作磁盘的合并操作时要求的最小数据量。合并数据片段时,ClickHouse 会计算要被合并的所有数据的总存储空间。如果大小超过了 min_merge_bytes_to_use_direct_io 设置的字节数,则 ClickHouse 将使用直接 I/O 接口(O_DIRECT 选项)对磁盘读写。如果设置 min_merge_bytes_to_use_direct_io = 0 ,则会禁用直接 I/O。默认值:10 * 1024 * 1024 * 1024 字节。
以上为建表参数描述,和MergeTree 相同,ver参数是本章重点。
示例
测试建表语句
CREATE TABLE default.ReplacingMergeTreeTest2
(
id UInt8,
version UInt8,
name String
) ENGINE = ReplacingMergeTree(version)
PARTITION BY id
ORDER BY id
插入数据
insert into default.ReplacingMergeTreeTest2(id,version,name) values(1,25,'张三');
insert into default.ReplacingMergeTreeTest2(id,version,name) values(1,22,'李四');
insert into default.ReplacingMergeTreeTest2(id,version,name) values(2,28,'nn');
合并数据
OPTIMIZE TABLE default.ReplacingMergeTreeTest2;
网友评论