从一个问题开始聊聊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,一经查实,立即删除!

相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

一款高输出电流 PWM 转换器

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

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 相关的进程,但它们在展示进程信息时有细微的区别。 ps aux | grep nexus: ps aux 是一种显示系统上所有运行进…

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

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

HYBBS 表白墙网站PHP程序源码

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

Linux 开发工具 yum、git、gdb

目录 一、yum 1、软件包 2、rzsz 3、注意事项 4、查看软件包 5、安装软件 6、卸载软件 二、git操作 1、克隆三板斧 2、第一次使用会出现以下情况: 未配置用户名和邮箱: push后弹出提示 三、gdb使用 1、背景 2、使用方法 例一&#xff1a…

MyBatis的#{}和${}:安全与灵活并存的SQL之道

MyBatis的#{}和${}:安全与灵活并存的SQL之道 MyBatis是一款广泛使用的Java持久化框架,提供了强大的SQL映射和数据库操作功能。在编写MyBatis的SQL语句时,我们经常会遇到#{}和${}两种不同的占位符语法。本文将详细解析#{}和${}的区别以及它们在…

Day30-Linux基础阶段总复习

Day30-Linux基础阶段总复习 1. 运维人员的三个核心职责(了解)2. 企业网站和应用的可用性的衡量标准(重点)2.1 高并发企业业务写入流程图2.2 中小型企业案例 3. Linux系统诞生发展过程中的关键代表人物4. 企业场景如何针对不同的业…

详解动态规划(算法村第十九关青铜挑战)

不同路径 62. 不同路径 - 力扣(LeetCode) 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finis…

HubSpot出海CRM智能化营销,创造无限商机

随着企业的全球化发展,营销的挑战也在不断增加。如何有效地管理多样化的市场、提升客户互动和参与度,成为了全球企业必须面对的重要问题。在这一挑战背景下,HubSpot出海CRM的营销自动化功能成为了企业的强大利器,为实施全球化营销…

Java多线程——synchronized、volatile 保障可见性

目录 引出synchronized、volatile 保障可见性Redis冲冲冲——缓存三兄弟:缓存击穿、穿透、雪崩缓存击穿缓存穿透缓存雪崩 总结 引出 Java多线程——synchronized、volatile 保障可见性 synchronized、volatile 保障可见性 原子性:在一次或者多次操作时…

【C++】Unordered_map Unordered_set

在C98中,STL提供了底层为红黑树结构的一系列关联式容器,例如map、set等。它们在搜索数据时效率可达到O(logN),但最糟糕的情况下搜索需要比较红黑树的高度次,若此时树中的节点非常之多,那么搜索效率就非常不理想。 最理…

python绘制趋势线

趋势线 趋势线是用来显示数据趋势或者预测未来发展方向的一种图形表示方法。在统计学和数据分析中,趋势线通常是通过拟合数据点来找到一条最符合数据整体趋势的直线、曲线或者其他形状。常见的趋势线拟合方法包括线性回归、多项式回归、指数平滑等。 趋势线在金融…