Clickhouse表引擎ReplacingMergeTree


title: Clickhouse表引擎ReplacingMergeTree
date: 2022-03-12 10:06:45
tags: [clickhouse, olap]
categories: clickhouse

我们都知道,clickhouse不支持直接更新,而是通过merge的方式实现的,上次说了CollapsingMergeTree,它是通过主键,还有一个标识字段,进行数据的折叠,来删除老的数据,今天来说下另外一种删除老的数据的策略:替换,ReplacingMergeTree。

ReplacingMergeTree

该引擎与MergeTree的区别在于,它会删除排序键值相同的重复项。

数据的去重只会在合并期间进行。合并会在后台一个不确定的时间进行,因此你无法预先做出计划。有一些数据可能仍未被处理。尽管你可以调用OPTIMIZE语句发起计划之外的合并,但请不要依靠它,因为OPTIMIZE操作会引发大量的数据读写操作。

因此,ReplacingMergeTree适用于在后台清理重复数据,以节省空间。但是它不保证没有重复的数据出现。

建表

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, ...]

ReplacingMergeTree的参数

  1. ver - 版本列,类型为UInt*、Date、DateTime。可选参数
    在数据合并的时候,ReplacingMergeTree从所有具有相同排序键的行中,选择一行留下:
    a. 如果ver列未指定,保留最后一条
    b. 如果ver列已指定,保留ver值最大的版本

实例

建表

CREATE TABLE emp_replacingmergetree
(
    emp_id UInt16 COMMENT '员工id',
    name String COMMENT '姓名',
    work_place String COMMENT '工作地点',
    age UInt8 COMMENT '员工年龄',
    depart String COMMENT '部门',
    salary Decimal32(2) COMMENT '薪水',
    ver UInt8 comment '版本号'
) ENGINE = ReplacingMergeTree(ver)
ORDER BY (emp_id, name)
PARTITION BY work_place
;

插入相同主键的两个版本数据

INSERT INTO emp_replacingmergetree VALUES (1, 'zhangsan', 'beijing', 25, 'tech', 20000, 1);
INSERT INTO emp_replacingmergetree VALUES (1, 'zhangsan', 'beijing', 29, 'tech', 30000, 2);

查看表中数据

localhost :) select * from emp_replacingmergetree;

SELECT *
FROM emp_replacingmergetree

Query id: d8e24f75-c83d-4e57-9ee7-291c0f4b7578

┌─emp_id─┬─name─────┬─work_place─┬─age─┬─depart─┬─salary─┬─ver─┐
│      1 │ zhangsan │ beijing    │  29 │ tech   │  30000 │   2 │
└────────┴──────────┴────────────┴─────┴────────┴────────┴─────┘
┌─emp_id─┬─name─────┬─work_place─┬─age─┬─depart─┬─salary─┬─ver─┐
│      1 │ zhangsan │ beijing    │  25 │ tech   │  20000 │   1 │
└────────┴──────────┴────────────┴─────┴────────┴────────┴─────┘

2 rows in set. Elapsed: 0.005 sec.

手动合并

optimize table emp_replacingmergetree;

-- 再次执行查询
localhost :) select * from emp_replacingmergetree;

SELECT *
FROM emp_replacingmergetree

Query id: bbc56bfb-6c78-4d4c-9c04-0e60803fb397

┌─emp_id─┬─name─────┬─work_place─┬─age─┬─depart─┬─salary─┬─ver─┐
│      1 │ zhangsan │ beijing    │  29 │ tech   │  30000 │   2 │
└────────┴──────────┴────────────┴─────┴────────┴────────┴─────┘

1 rows in set. Elapsed: 0.003 sec.

总结

所以,ReplacingMergeTree表引擎会删除排序键重复的数据,留下版本最大的一条,实现删除和更新的操作。
而上次介绍的CollapsingMergeTree会通过数据的新增和删除标记来实现,实现数据的更新会多插入一条数据。


Keep reading, Keep writing, Keep coding.

欢迎关注我的微信公众号,比较喜欢分享知识,也喜欢宠物,所以做了这2个公众号:
程序员写书

喜欢宠物的朋友可以关注:【电巴克宠物Pets】
电巴克宠物

一起学习,一起进步。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chenzuoli

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值