目录
- 建表语法
- 数据处理策略
- 资料分享
- 参考文章
MergeTree拥有主键,但是它的主键却没有唯一键的约束 。这意味着即便多行数据的主键相同,它们还是能够被正常写入 。在某些使用场合,用户并不希望数据表中含有重复的数据 。ReplacingMergeTree就是在这种背景下为了数据去重而设计的,它能够在合并分区时删除重复的数据 。但是ReplacingMergeTree并不一定保证不会出现重复的数据 。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表的参数中 , 与MergeTree不同的是[ver] 。ver(版本列) 。类可以型为UInt*,Date或DateTime 。这个属于可选参数,所以你也可以不用指定 。在数据合并的时候,ReplacingMergeTree 从所有具有相同排序键的行中选择一行留下:如果ver列未指定 , 保留最后一条 。如果ver列已指定,保留ver值最大的版本 。
其他的与MergeTree表是一致,它属于MergeTree表的的一个变种 。
MergeTree表引擎的解析可以参考ClickHouse(09)ClickHouse合并树MergeTree家族表引擎之MergeTree详细解析
数据处理策略最后总结一下ReplacingMergeTree引擎的数据处理策略 , 主要是下面五个点 。
- 使用ORBER BY排序键作为判断重复数据的唯一键 。
- 只有在合并分区的时候才会触发删除重复数据的逻辑 。
- 以数据分区为单位删除重复数据 。当分区合并时,同一分区内的重复数据会被删除;不同分区之间的重复数据不会被删除 。
- 在进行数据去重时,因为分区内的数据已经基于ORBER BY进行了排序 , 所以能够找到那些相邻的重复数据 。
- 在数据合并的时候,ReplacingMergeTree 从所有具有相同排序键的行中选择一行留下:如果ver列未指定,保留最后一条 。如果ver列已指定 , 保留ver值最大的版本 。
参考文章
- ClickHouse(01)什么是ClickHouse,ClickHouse适用于什么场景
- ClickHouse(02)ClickHouse架构设计介绍概述与ClickHouse数据分片设计
- ClickHouse(03)ClickHouse怎么安装和部署
- ClickHouse(04)如何搭建ClickHouse集群
- ClickHouse(05)ClickHouse数据类型详解
- ClickHouse(06)ClickHouse建表语句DDL详细解析
- ClickHouse(07)ClickHouse数据库引擎解析
- ClickHouse(08)ClickHouse表引擎概况
- ClickHouse(09)ClickHouse合并树MergeTree家族表引擎之MergeTree详细解析
- ClickHouse(10)ClickHouse合并树MergeTree家族表引擎之ReplacingMergeTree详细解析
- ClickHouse(11)ClickHouse合并树MergeTree家族表引擎之SummingMergeTree详细解析
推荐阅读
- 二叉搜索树 - C++ 实现
- 原神掣电树传送点怎么开启
- 原神梦境与树任务怎么完成
- 野火 STM32MP157 开发板内核和设备树的编译烧写
- 原神探索莎兰树的梦任务怎么完成
- FHQ Treap 详解
- 原神3.0成就众花园中的一棵核桃树怎么完成
- 原神梦境与树前往指定地点任务怎么完成
- git 多个commit 如何合并
- 树的邻接矩阵、双亲孩子表示法…… C++ 不知树系列之初识树