从一个问题开始聊聊clickhouse的物化视图

【问题】

今天有A问我一个问题,我明明创建了一个物化视图,源表是有数据的,为什么查询物化视图就没有数据?

创建物化视图的SQL示意如下:

CREATE MATERIALIZED VIEW schema1.test_mvon cluster clusterNameTO schema1.test_dtl(`field_a` UInt64,`field_b` UInt32,`field_f` Int8)
AS
SELECT t1.field_a,t2.field_b,t3.field_f
FROM schema1.table1 AS t1LEFT JOIN(SELECT field_a,field_bFROM schema1.table4 t4) AS t2 ON t1.field_a = toUInt64(t2.field_a)LEFT JOIN schema1.table3 AS t3 ON t2.field_b = t3.field_e
WHERE (t1.create_type = 1)

A的意思是

SELECT t1.field_a,t2.field_b,t3.field_f
FROM schema1.table1 AS t1LEFT JOIN(SELECT field_a,field_bFROM schema1.table4 t4) AS t2 ON t1.field_a = toUInt64(t2.field_a)LEFT JOIN schema1.table3 AS t3 ON t2.field_b = t3.field_e
WHERE (t1.create_type = 1)

是有数据的,但是直接查

select * from schema1.test_mv是没数据的

由于我很久没有用物化视图,也是愣了一下,自己动手做了些实验才搞懂。

其实,如果熟悉clickhouse物化视图的特性,就知道创建的物化视图并不会把创建之前的数据给加载进来,只会把创建物化视图后的数据加载进来,所以一开始查不到数据是正常的。

借这个机会,我也边做实验边复习了一下物化视图的相关知识。

物化视图的机制是什么

一个物化视图的实现是这样的:当向SELECT中指定的表插入数据时,检测到有物化视图跟它关联,会针对这批写入的数据进行物化操作。即插入数据的一部分被这个SELECT查询转换,结果插入到视图中。

物化视图其实是数据库中的预计算逻辑+显式缓存,典型的空间换时间思路。

物化视图可以计算聚合,重组表主索引和排序顺序,可以很好地跨大量节点和处理大型数据集。

因此,ClickHouse 中的物化视图更像是插入触发器。 如果视图查询中有一些聚合,则它仅应用于一批新插入的数据。 对源表现有数据的任何更改(如更新、删除、删除分区等)都不会更改物化视图。

为什么需要物化视图

想像一个场景:有一个大的用户日志表,需要每个小时统计一些用户行为指标(例如登录时长)

如果每个小时都从这个大表里面去读,则由于数据量太大,效率很慢,而且对这个表的压力会很大(尤其是各种指标需求都需要访问这个表)。

有一个方法如果对 用户日志表 进行预聚合,把结果保存到一个新表 xx_mv,并随着 用户日志表 增量实时更新,每次去查询xx_mv 就可以了。

这就是物化视图的其中一个作用。

为何物化视图比表查询快

一般来说物化视图会快一些。

因为物化视图相当于物理表,已经将符合条件的数据存入物理的物化视图表中,查询已经和原来的基表没有关系,因此一般来说物化视图的数据量会远小于原来的基表。

而直接查询或者使用一般的视图还是要在原来的基表中查询。

物化视图在复杂的SQL查询的时候效果就很明显了,可以把一个查询出来的数据存到物理空间里,还可以创建索引、排序等等。

下面我们用具体的实验例子来看看这些特性。

物化视图的几个有趣的特性

物化视图与表一样可以指定表引擎、分区键、主键和表设置参数

例如:

CREATE MATERIALIZED VIEW test_mv

ENGINE = SummingMergeTree

PARTITION BY toYYYYMM(ctime) ORDER BY (userid)

AS SELECT

 xxx

FROM table WHERE ctime >= toDateTime('2024-01-01 00:00:00')

GROUP BY userid

物化视图并不会把创建之前的数据给加载进来

准备表table1,table2,talbe4,里面灌入相关数据,然后执行:

SELECT t1.field_a, t1.field_b, t3.field_f FROM schema1.table1 AS t1 LEFT JOIN ( SELECT field_a, field_b FROM schema1.table4 t4 ) AS t2 ON t1.field_a = toUInt64(t2.field_a) LEFT JOIN schema1.table3 AS t3 ON t2.field_b = t3.field_e WHERE (t1.create_type = 1)

返回数据是500+

此时还没创建物化视图

然后创建物化视图:

CREATE MATERIALIZED VIEW schema1.test_mvon cluster clusterNameTO schema1.test_dtl(`field_a` UInt64,`field_b` UInt32,`field_f` Int8)
AS
SELECT t1.field_a,t2.field_b,t3.field_f
FROM schema1.table1 AS t1LEFT JOIN(SELECT field_a,field_bFROM schema1.table4 t4) AS t2 ON t1.field_a = toUInt64(t2.field_a)LEFT JOIN schema1.table3 AS t3 ON t2.field_b = t3.field_e
WHERE (t1.create_type = 1)

其中schema1.test_dtl是新表的实体表,里面数据是空的。

查询创建好的物化视图和物化视图表:

select * from schema1.test_mv

select * from schema1.test_dtl

均返回空,表明物化视图并不会把创建之前的数据给加载进来

然后往table1中插入数据:

insert into schema.table1(field_a,create_type)  values(1,1),(2,1);

然后查询

物化视图和物化视图表:

select * from schema1.test_mv

select * from schema1.test_dtl

均返回相同的两条数据,表明当向SELECT中指定的表插入数据时,检测到有物化视图跟它关联,会针对这批写入的数据进行物化操作

这里就有一个问题:为什么有了物化视图,还需要加个物化视图表?

其实就是问要不要创建物化视图时进行 [TO[db.]name] 配置

如果创建物化视图时不带TO [db].[table],且必须指定ENGINE用于存储数据的表引擎,和建表类似,这种方法ClickHouse会创建一个隐藏的目标表(私有表)来保存视图数据,可以通过SHOW TABLES查看(inner_id开头的表);删除视图,私有表会消失;

如果使用TO [db].[table]创建物化视图,[db].[table]必须是一张已经存在的表,用来保存视图数据,此时创建物化视图相当于在表上面附加了一个物化视图。

需要注意,间接创建不能使用POPULATE关键字。

配置的好处:可以明确指定物化视图的存储位置,避免与其他表或视图产生名称冲突或者误删误操作。

另外,如果物化视图表本身是有数据的,那么在创建物化视图后,该物化视图就会含有该物化视图表的数据。

不指定POPULATE时如何初始化

clickhouse有POPULATE关键字的,但是不建议使用POPULATE,因为在创建视图期间插入基础表中的数据不会被插入物化视图,会造成数据的丢失。

如果指定POPULATE,则在创建视图时将现有表数据插入到视图中,就像创建一个CREATE TABLE ... AS SELECT ...一样。

那么在不用POPULATE的前提下,怎么进行物化视图的初始化?其实很简单:在 MV 建好之后将数据手动insert into test_mv select * from 来导入数据到 MV 

对源表现有数据的任何更改(如更新、删除、删除分区等)都不会更改物化视图

还是使用上面创建好的test_mv,由于前面我们执行

insert into schema.table1(field_a,create_type)  values(1,1),(2,1);

所以目前test_mv里面有两条数据。

我们修改table1中的数据:

alter table schema.table1_replica(本地表) on cluster  clusterName

update create_type=2 where field_a=1

按照前面的创建物化视图的sql,我们知道只会把schema.table1里面create_type=1的数据纳入物化视图,因此,我们去查现有的test_mv:

select * from schema1.test_mv

仍然是原先是两条数据。

因此可以证明,对源表现有数据的修改,不会更改物化视图

同理,物化视图不支持同步删除,若源表的数据不存在(删除了)则物化视图的数据仍然保留

在创建 MV 表时如用到了多表联查,只有当第一个查询的表有数据插入时,这个 MV 才会被触发

还是使用上面创建好的test_mv,目前有两条数据

(field_a,field_b,create_type) ==>(1,0,1),(2,0,1);

我们插入table4的数据:

insert into cs_data.table4(field_a,field_b) values(1,99999) ,(2,8888);

然后查询test_mv,发现数据没变,仍然是:

(field_a,field_b,create_type) ==>(1,0,1),(2,0,1);

而不是(field_a,field_b,create_type) ==>(1,99999,1),(2,888,1);

表明在创建 MV 表时如用到了多表联查,只有当第一个查询的表有数据插入时,这个 MV 才会被触发

无缝更改ClickHouse物化视图SELECT逻辑的方法  

无缝更改ClickHouse物化视图SELECT逻辑的方法-CSDN博客

物化视图的缺点

1.空间换时间,因此占空间。

2.使用难度较大,需要合理设计表结构对历史数据做聚合分析

3.仅支持插入触发,不支持历史数据的更新

4.它的本质是一个流式数据的使用场景,是累加式的技术,所以要用历史数据做去重、去更新的场景,就不适合

因此,如果一张表加了好多物化视图,在写这张表的时候,就会消耗很多机器的资源,比如数据带宽占满、存储一下子增加了很多。

物化视图适合的场景

1.解决表索引问题,我们可以用物化视图创建另外一种物理序,来满足某些条件下的查询问题。

2.可以借助 MergeTree 家族引擎(SummingMergeTree、Aggregatingmergetree等),得到一个实时的预聚合,满足快速查询。

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

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

相关文章

Spring Mybatis Mapper 模糊查询的几种方法

在Spring结合Mybatis进行开发时,实现模糊查询是一个常见需求。在Mybatis中,LIKE查询可以通过多种方式实现,这取决于你的查询参数如何传递给Mybatis的SQL映射器。以下是实现模糊查询的几种常见方法: 1. 在Mapper接口中直接使用#{}…

【物联网应用案例】从0到N,智慧农业的数据价值

智慧农业全方位渗透到农业的每一个环节,云端解决方案更推动了研究人员、农艺师及农民间的密切协作,为研发企业提供了既经济又具扩展性的完美方案。 据IDC预计,到2036年,农场收集的数据量将增加800%以上,这凸显了农业数…

七.AV Foundation 视频播放 - 图片进度条

引言 播放器的功能功能已经十分完善了,接下来我们给它添加一些提升用户体验的功能。当前市面上的主流播放器几乎都有一个非常友善的功能,用户在退拽进度条的时候可以看见进度条所处进度的视频画面,这对于用户来说是一种直观而且便捷的体验。…

LeetCode刷题---二叉树展开为链表

官方题解:LeetCode官方题解 解题思想: 当根节点不为空时,从二叉树根节点开始遍历 判断当前节点是否有左节点,如果不存在左节点,则当前节点向右移一位 如果存在左节点,创建辅助节点指向左节点,判…

【Python】新手入门(9):数值和序列

🐍【Python】新手入门(9):数值和序列 🌈 个人主页:高斯小哥 🔥 高质量专栏:Matplotlib之旅:零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&am…

百度智能云千帆大模型平台发布会定档3月21日,新模型已悄然上线

百度智能云官微日前宣布,百度智能云千帆产品发布会(AI Cloud Day)将于2024年3月21日在北京举行,届时将揭晓千帆ModelBuilder 和 AppBuilder 的最新产品进展,并发布系列新模型及开发工具组件。 记者在百度智能云官网上发…

O2O:Offline Meta-Reinforcement Learning with Online Self-Supervision

ICML 2022 paper Introduction 元强化学习(Meta RL)结合O2O。元RL需要学习一个探索策略收集数据,同时还需学习一个策略快速适应新任务。由于策略是在固定的离线数据集上进行元训练的,因此在适应探索策略收集的数据时,它可能表现得不可预测&…

97、我对 AI 模型调优的经验和认识

做 AI 算法调优一些年了,这些年中接触了不少模型,也做过不少在 ASIC 芯片进行模型加速的案例。 在接触的模型中,有一些模型有着非常奇怪的分支结构,有的还有奇怪的 tensor shape,还有的有这奇怪的自定义算法。但在模型优化时,为了将一个 AI 模型性能调到最优,也是无所不…

代码随想录三刷 day16 | 二叉树之104.二叉树的最大深度 559.n叉树的最大深度 111.二叉树的最小深度 222.完全二叉树的节点个数

三刷day16 104.二叉树的最大深度559.n叉树的最大深度111.二叉树的最小深度222.完全二叉树的节点个数 104.二叉树的最大深度 题目链接 解题思路: 本题中根节点的高度就是最大深度 二叉树节点的深度: 指从根节点到该节点的最长简单路径边的条数或者节点数…

飞桨AI框架安装和使用示例

飞桨AI框架安装和使用示例 飞桨PaddlePaddle是非常流行的国产AI框架,让我们一起来动手实践吧! 安装 飞桨安装参考页面:https://www.paddlepaddle.org.cn/install/quick?docurl/documentation/docs/zh/install/pip/linux-pip.html 在这个安…

AttributeError: ‘SFTPClient‘ object has no attribute ‘exists‘问题解决

在使用paramiko库进行SFTP操作时,如果遇到AttributeError: SFTPClient object has no attribute exists错误,这意味着你尝试调用的.exists()方法并不直接存在于paramiko.SFTPClient对象中。 虽然SFTPClient类没有内置的.exists()方法,但你可…

【S32K3 MCAL配置】-1.2-GPIO配置及其应用-DIO之高低电平输入-按键(基于MCAL)

"><--返回「Autosar_MCAL高阶配置」专栏主页--> 目录(共11页精讲,基于评估板: NXP S32K312EVB-Q172,手把手教你S32K3从入门到精通) 实现的架构:基于MCAL层 前期准备工作:

垃圾分类网站|基于Springboot框架+java+MYSQL数据库的垃圾分类网站开发设计与实现(可运行源码+数据库+文档)

目录 1.摘 要 2.系统结构设计 3.系统顺序图设计 4.数据库设计 5.系统详细设计 用户前台功能模块 管理员功能模块 垃圾分类管理员功能模块 论文参考 文末获取源码 1.摘 要 本论文主要论述了如何使用JAVA语言开发一个垃圾分类网站 &#xff0c;本系统将严格按照软件开发…

「雷神加速器」pubg m登陆不上去、连接超时、无法进入游戏解决方法

Pubg Mobile(简称pubg m)作为人气吃鸡端游绝地求生PUBG的正版授权手游,完美保留了游戏中跳伞、跑毒、缩圈、捡装备的经典要素玩法,在手游玩家中有着极高的人气。近期,不少老玩家在登陆启动pubg m时出现登陆不上去、连接超时、无法进入游戏的情况,这里为大家整理汇总了几种常用解…

一款高输出电流 PWM 转换器

一、产品描述 TPS543x 是一款高输出电流 PWM 转换器&#xff0c;集成了低电阻、高侧 N 沟道 MOSFET。具有所列的特性的基板上还包括高性能电压误差放大器&#xff08;可在瞬态条件下提供高稳压精度&#xff09;、欠压锁定电路&#xff08;用于防止在输入电压达到 5.5V 前启动&…

【Oracle】oracle中sql给表新增字段并添加注释说明;mysql新增、修改字段

oracle中sql给表新增字段并添加注释说明 ALTER TABLE 表名 ADD 字段名 类型 COMMENT ON COLUMN 表面.字段名 IS ‘注释内容’ ALTER TABLE GROUP ADD T NUMBER(18) COMMENT ON COLUMN GROUP.T IS ‘ID’ mysql新增、修改字段、已有字段增加默认值 ALTER TABLE 表名 ADD COL…

ps aux | grep xxxx和ps ef | grep xxxx这两个命令有什么区别

命令实例 ps aux | grep nexus和ps ef | grep nexus ps aux | grep nexus 和 ps ef | grep nexus 这两个命令都用于在 Unix 或 Linux 系统中查找与 nexus 相关的进程&#xff0c;但它们在展示进程信息时有细微的区别。 ps aux | grep nexus: ps aux 是一种显示系统上所有运行进…

Java 获取元素坐标详情

获取整个页面的高度 int window_height driver.manage().window().getSize().height; 获取整个页面的宽度 int window_height driver.manage().window().getSize().width; 获取元素大小 高度 int height afghanistanIdItem.getSize().getHeight(); 获取元素大小 宽度 …

中间件 | Redis - [基本信息]

INDEX 1 常规用法2 QPS3 pipeline 1 常规用法 分布式锁 最常见用法&#xff0c;需要注意分布式锁的redis需要单点 分布式事务 分布式事务中&#xff0c;核心的技术难点其实是分布式事务这个事本身作为数据的持久化 2PC&#xff0c;比如 seata 的 AT 模式下&#xff0c;将 un…

HYBBS 表白墙网站PHP程序源码

安装教程 上传程序安装&#xff0c;然后设置账号密码&#xff0c;登陆后台切换模板手机PC都要换开启插件访问前台。 安装完成后如果不能正常访问就删除install安装文件夹 安装完成后右上角登录后点击头图进入后台 找到插件 安装表白墙配置插件 找到模板 将表白墙模板同时设…