Clickhouse学习笔记(11)—— 数据一致性

使用合并树引擎时,无论是ReplacingMergeTree还是SummingMergeTree,都只能保证数据的最终一致性,因为数据的去重、聚合等操作会在数据合并的期间进行,而合并会在后台以一个不确定的时间进行,因此无法预先计划;

数据准备

建表:

CREATE TABLE test_consistence(user_id UInt64,score String,deleted UInt8 DEFAULT 0,create_time DateTime DEFAULT toDateTime(0)
)ENGINE= ReplacingMergeTree(create_time)
ORDER BY user_id;

其中deleted作为是否删除的标识;create_time 是版本号字段,每组数据中 create_time 最大的一行表示最新的数据

导入数据:

INSERT INTO TABLE test_consistence(user_id,score)
WITH(SELECT ['A','B','C','D','E','F','G']
)AS dict
SELECT number AS user_id, dict[number%7+1] FROM numbers(10000000);

数据结构如下:

通过修改create_time的值,可以更新数据:

INSERT INTO TABLE test_consistence(user_id,score,create_time)
WITH(SELECT ['AA','BB','CC','DD','EE','FF','GG']
)AS dict
SELECT number AS user_id, dict[number%7+1], now() AS create_time FROM 
numbers(500000);

now()函数可以获取当前时间

查询发现,此时表中共有10500000条数据,说明还未进行去重;

去重方案

手动 OPTIMIZE

在写入数据后,立刻执行 OPTIMIZE 强制触发新写入分区的合并动作

optimize table test_consistence;

耗费时间:

可以看到,optimize是一个相对比较耗时的操作(与select、insert相比),因为需要进行大量的数据读写

通过 Group by 去重

执行去重的查询

SELECTuser_id ,argMax(score, create_time) AS score, argMax(deleted, create_time) AS deleted,max(create_time) AS ctime 
FROM test_consistence 
GROUP BY user_id
HAVING deleted = 0;

函数argMaxargMax(field1,field2):按照 field2 的最大值取 field1 的值

因此argMax(score, create_time)的含义就是,按照create_time的最大值取score的值,因为create_time代表当前数据的更新时间,因此总能取到最新的数据;

同理argMax(deleted, create_time)是取最新的deleted标识,来判断数据是否被删除

创建视图

通过上面的操作我们可以实现数据的去重等操作,从而保证一致性,因此创建视图来保存数据查询的逻辑

CREATE VIEW view_test_consistence AS
SELECTuser_id ,argMax(score, create_time) AS score, argMax(deleted, create_time) AS deleted,max(create_time) AS ctime 
FROM test_consistence 
GROUP BY user_id
HAVING deleted = 0;

视图创建的格式:create view view_name as select......

注意:这里创建的视图仅仅保存了数据查询的逻辑,并不保存具体的数据;

测试去重效果

插入数据:

insert into test_consistence(user_id, score, create_time) values(0, 'AAAA', now());

然后查询数据:

select * from test_consistence where user_id = '0';

发现并未去重;

而从视图中查询:

select * from view_test_consistence where user_id = '0';

则仅有最新的数据:

通过 FINAL 查询

在查询语句后增加 FINAL 修饰符,这样在查询的过程中将会执行 Merge 的特殊逻辑(例如数据去重,预聚合等)

测试

① 不使用final查询:

select * from visits_v1 WHERE StartDate = '2014-03-17' limit 100;

②使用final查询:

select * from visits_v1 final WHERE StartDate = '2014-03-17' limit 100;

可以看到,查询速度并没有普通的查询快,因此使用final确保数据一致性也是以效率为代价的;

版本说明

早期版本增加 FINAL 之后,查询会变成单线程;但从v20.5.2.7-stable版本之后转为多线程执行,并可以通过max_final_threads 参数控制单个查询的线程数:

explain pipeline select * from visits_v1 final WHERE StartDate = '2014-03-17' limit 100;

可以看到从 CollapsingSortedTransform 这一步开始已经是多线程执行,但是读取 part 部分的动作还是串行

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/172067.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

11-13 /11-14代理模式 AOP

调用者 代理对象 目标对象 代理对象除了可以完成核心任务,还可以增强其他任务,无感的增强 代理模式目的: 不改变目标对象的目标方法的前提,去增强目标方法 分为:静态代理,动态代理 静态代理 有对象->前提需要有一个类,那么我们可以事先写好一个类&a…

JAVA 版小程序商城免费搭建 多商家入驻 直播带货 商城系统 B2B2C 商城源码之 B2B2C产品概述

1. 涉及平台 平台管理、商家端(PC端、手机端)、买家平台(H5/公众号、小程序、APP端(IOS/Android)、微服务平台(业务服务) 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、Redis 3. 前端框架…

黑马程序员微服务SpringCloud实用篇02

SpringCloud实用篇02 0.学习目标 1.Nacos配置管理 Nacos除了可以做注册中心,同样可以做配置管理来使用。 1.1.统一配置管理 当微服务部署的实例越来越多,达到数十、数百时,逐个修改微服务配置就会让人抓狂,而且很容易出错。我…

今日最新版早安问候大全,创意好看的早上好祝福图片带字温馨

1、阳光照,鸟欢叫,小懒猪,起床了,伸懒腰,笑一笑,深呼吸,精神好,开心到,欢乐抱,幸福随,乐淘淘,好运伴,祝福来,每…

MySQL 索引事务

MySQL 索引&事务 文章目录 MySQL 索引&事务1. 索引1.1 概念1.2 作用1.3 使用场景1.4 使用 2. 事务2.1 为什么使用事务2.2 事务概念2.3 事务的特性2.4 使用 1. 索引 1.1 概念 索引(index)是一种特殊的文件,包含着对数据表里所有记录的引用指针。可以对表中的…

Elasticsearch7 入门 进阶

1、全文检索 1.1、数据分类 按数据分类的话,主要可以分为以下三类: 结构化数据:固定格式、有限长度,比如mysql存的数据非结构化数据:不定长、无固定格式,比如邮件、Word文档、日志等半结构化数据&#xf…

负公差轧钢测径仪 多规格可定制 普通智能随意选择

负公差轧制的意义: 轧钢厂生产的螺纹钢是按理论重量销,因此稳定的高负差产品极具市场竞争力。负差率即实际重量与理论重量的差值,除以理论重量,乘100%。以螺纹12为例,不按负差生产,在坯重2450kg的情况下&am…

21.计算老师的工资

(定义结构体数组存放教师的财务信息(教工卡号,应发工资,个人所得税,实发工资)具体要求如下从键盘输入5个教师的教工卡号,应发工资 计算每人的个人所得税(应发工资10%)&am…

Linux Zabbix企业级监控平台+cpolar实现远程访问

文章目录 前言1. Linux 局域网访问Zabbix2. Linux 安装cpolar3. 配置Zabbix公网访问地址4. 公网远程访问Zabbix5. 固定Zabbix公网地址 前言 Zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。能监视各种网络参数,保证服务器系…

7天入门python系列之第五天python项目练习

第七天 Python项目实操 编者打算开一个python 初学主题的系列文章,用于指导想要学习python的同学。关于文章有任何疑问都可以私信作者。对于初学者想在7天内入门Python,这是一个紧凑的学习计划。但并不是不可完成的。 学到第7天说明你已经对python有了一…

Python+Appium自动化测试框架详解

appium简介 Appium 是一个开源的、跨平台的测试框架,可以用来测试 Native App、混合应用、移动 Web 应用(H5 应用)等,也是当下互联网企业实现移动自动化测试的重要工具。Appium、Appium-desktop、Appium Client 的区别是 Appium …

Live800:高效工作,客服人必学的10种时间效率管理术

客服人员是企业与客户沟通的桥梁,需要在繁忙的工作环节中保持高效率。只有提高时间效率才能更好地服务客户,满足客户的需求,提升客户满意度。因此,客服人员需要掌握时间效率管理术来提高工作效率。 1、制定工作计划 在开始工作之…