详解ClickHouse的ReplaceMergeTree

区别于MergeTree表引擎,ReplacingMergeTree删除重复数据时是通过相同的分区值(ORDER BY的值)

数据去重发生在后台合并数据时,后台合并数据是随机的,所以有时会有一些没处理的数据,可以通过OPTIMIZI来手动合并,官方建议不要指望它,因为OPTIMIZE会读写大量的数据(可能是会从头再合并一的原因吧)

所以,ReplacingMergeTre适用于后台去重数据来节省空间的场景,但不保证没有一个重复的(官方说的,不是我说的)

建一个表

复制代码
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 [, is_deleted]])
[PARTITION BY expr]
[ORDER BY expr]
[PRIMARY KEY expr]
[SAMPLE BY expr]
[SETTINGS name=value, clean_deleted_rows=value, ...]

建表参数描述

ver

可选,填入类型UInt*, Date, DateTime or DateTime64

这个字段的作用是在合并时,决定要留下哪一个

*原则一:*选最新的那个,ver没设置时,替换为最新插入的那一行

*原则二:*选最大的那个,ver设置时,选择设置值中最大的那一行

例子

复制代码
-- without ver - the last inserted 'wins'
CREATE TABLE myFirstReplacingMT
(
    `key` Int64,
    `someCol` String,
    `eventTime` DateTime
)
ENGINE = ReplacingMergeTree
ORDER BY key;
​
INSERT INTO myFirstReplacingMT Values (1, 'first', '2020-01-01 01:01:01');
INSERT INTO myFirstReplacingMT Values (1, 'second', '2020-01-01 00:00:00');
​
SELECT * FROM myFirstReplacingMT FINAL;
​
┌─key─┬─someCol─┬───────────eventTime─┐
│   1 │ second  │ 2020-01-01 00:00:00 │
└─────┴─────────┴─────────────────────┘
​
​
-- with ver - the row with the biggest ver 'wins'
CREATE TABLE mySecondReplacingMT
(
    `key` Int64,
    `someCol` String,
    `eventTime` DateTime
)
ENGINE = ReplacingMergeTree(eventTime)
ORDER BY key;
​
INSERT INTO mySecondReplacingMT Values (1, 'first', '2020-01-01 01:01:01');
INSERT INTO mySecondReplacingMT Values (1, 'second', '2020-01-01 00:00:00');
​
SELECT * FROM mySecondReplacingMT FINAL;
​
┌─key─┬─someCol─┬───────────eventTime─┐
│   1 │ first   │ 2020-01-01 01:01:01 │
└─────┴─────────┴─────────────────────┘

is_deleted

ver设置后才能设置is_deleted,用来标记这行数据是否删除,1代表删除(deleted),0代表存在(state)

想真正删除数据, 执行OPTIMIZE ... FINAL CLEANUPOPTIMIZE ... FINAL 或者表引擎配置 clean_deleted_rows 设置为 Always.

例子

复制代码
-- with ver and is_deleted
CREATE OR REPLACE TABLE myThirdReplacingMT
(
    `key` Int64,
    `someCol` String,
    `eventTime` DateTime,
    `is_deleted` UInt8
)
ENGINE = ReplacingMergeTree(eventTime, is_deleted)
ORDER BY key;
​
INSERT INTO myThirdReplacingMT Values (1, 'first', '2020-01-01 01:01:01', 0);
INSERT INTO myThirdReplacingMT Values (1, 'first', '2020-01-01 01:01:01', 1); 
​
select * from myThirdReplacingMT final;
​
0 rows in set. Elapsed: 0.003 sec.
​
-- 删除is_deleted标记为1的行
OPTIMIZE TABLE myThirdReplacingMT FINAL CLEANUP; 
​
INSERT INTO myThirdReplacingMT Values (1, 'first', '2020-01-01 00:00:00', 0);
​
select * from myThirdReplacingMT final; 
​
┌─key─┬─someCol─┬───────────eventTime─┬─is_deleted─┐
│   1 │ first   │ 2020-01-01 00:00:00 │          0 │
└─────┴─────────┴─────────────────────┴────────────┘
相关推荐
麦聪聊数据4 小时前
电商大促数据库管控(下):数据需求小时级交付与全链路安全管控
数据库
喜欢的名字被抢了4 小时前
MySQL核心机制:事务、锁与存储引擎
数据库·sql·mysql·教程
JosieBook4 小时前
【数据库】时序数据库通过国测认证,TimechoAI开放体验:工业数据的“存”与“智”如何协同?
数据库·时序数据库
卓怡学长5 小时前
w263基于springboot + vue 健康饮食管理系统
java·数据库·vue.js·spring boot·spring·intellij-idea
阿演7 小时前
DataDjinn v0.2.11:SQL 编辑、AI 协作和表格操作继续打磨
数据库·人工智能·sql
智脑API平台8 小时前
Codex 国内使用会封号吗?账号安全、中转站和合规边界说明
数据库·redis·缓存
l1t8 小时前
duckdb 1.6dev新增的.manual命令
开发语言·数据库
辉灰笔记8 小时前
第一篇:MySQL8.0生产备份实战|XtraBackup全自动全量+增量备份(钉钉告警+异地Binlog归档)
数据库·mysql·钉钉·运维开发
山峰哥9 小时前
‌Explain实战:打开数据库执行计划的黑盒‌
大数据·服务器·数据库·sql·深度优先·宽度优先
ClickHouseDB9 小时前
ClickHouse 26.6 版本发布说明
数据库