ClickHouse物化视图

发布时间:2026/10/17 10:53:03
ClickHouse物化视图 ClickHouse的物化视图是一种查询结果的持久化存在是为了带来查询效率的提升。它就是一张逻辑表是一张时刻在预计算的表创建的过程是用一个特殊引擎加上后来 as select就是 create 一个 table as select 的写法普通视图普通视图不保存数据保存的仅是查询语句查询的时候还是从原表读取数据可以将普通视图理解为是个子查询。物化视图物化视图是把查询的结果根据相应的引擎存入到了磁盘或内存中对数据重新进行了组织你可以理解物化视图是完全的一张新表优点查询速度快要是把物化视图这些规则全部写好它比原数据查询快了很多总的行数少了因为都预计算好了。缺点本质是一个流式数据的使用场景是累加式的技术所以要用历史数据做去重、去核这样的分析在物化视图里面是不太好用的如果一张表加了好多物化视图在写这张表的时候就会消耗很多机器的资源比如数据带宽占满、存储一下子增加了很多CREATE [MATERIALIZED] VIEW [IF NOT EXISTS] [db.]table_name [TO[db.]name] [ENGINE engine] [POPULATE] AS SELECT ...使用 create 创建一个物化视图会创建一个隐藏的目标表来保存视图数据也可以 TO 表名保存到 一 张显式的表。没有加 TO 表名表名默认就是 .inner.物化视图名创建 pm 性能数据表性能表以 start_time 和 ne_name 为组合主键day_id 为分区ReplacingMergeTree 为合并引擎pm 性能数据表CREATE TABLE test_pm( start_time DateTime comment 数据时间, name String comment 名称, pm String comment pm, day_id String comment 天 ) engineReplacingMergeTree() partition by day_id primary key (start_time,name) order by (start_time,name)cm 配置数据表create table test_cm( insert_time DateTime comment 插入时间, name String comment 名称, cm String comment cm, day_id String comment 天 ) engineReplacingMergeTree() partition by day_id PRIMARY key name order by name数据-- pm 性能数据 INSERT INTO table test_pm values(now(),NE_01,100,2024-01-17); INSERT INTO table test_pm values(now(),NE_02,100,2024-01-17); INSERT INTO table test_pm values(now(),NE_03,100,2024-01-17); INSERT INTO table test_pm values(now(),NE_04,100,2024-01-17); -- 模拟重复数据 INSERT INTO table test_pm values(now(),NE_01,200,2024-01-17); INSERT INTO table test_pm values(now(),NE_01,500,2024-01-17); select * from test_pm -- cm 配置数据 INSERT INTO table test_cm values(now(),NE_01,10,2024-01-17); INSERT INTO table test_cm values(now(),NE_02,10,2024-01-17); INSERT INTO table test_cm values(now(),NE_03,10,2024-01-17); INSERT INTO table test_cm values(now(),NE_04,10,2024-01-17);通过 ne_name 将 cm 配置表中的数据关联到 pm性能表中达到扩充表字段目的。特别注意不建议添加 populate 关键字原因在最下面create materialized view test_view engineReplacingMergeTree() partition by day_id primary key (start_time,name) order by (start_time,name) populate as select pm.start_time, pm.name, pm.pm, cm.cm, pm.day_id from test_pm pm left join test_cm cm on pm.namecm.name select * from test_view1、populate 参数不建议添加这个参数会导致历史数据的计算如果不添加此参数则物化视图创建之后只对新增数据进行物化视图的计算。2、不使用 populate 又想刷新历史数据可以使用 insert into Table2(field1,field2,field3,...) select value1,value2,... from Table1 方式进行数据刷入。以下举例说明-- 将 2024年以来的数据重新刷入到物化视图中物化视图使用了 ReplacingMergeTree 引擎可以根据主键合并将最新的结果数据更新进去 insert into default.test_mv select a.insert_time, a.start_time, a.ne_name, a.pm, b.cm, a.day_id from default.test_pm a left join test_cm b on a.ne_name b.ne_name where a.start_time 202401010000

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询